Java中常见错误和异常解决方法.docx

上传人:b****7 文档编号:10171403 上传时间:2023-02-09 格式:DOCX 页数:34 大小:205.45KB
下载 相关 举报
Java中常见错误和异常解决方法.docx_第1页
第1页 / 共34页
Java中常见错误和异常解决方法.docx_第2页
第2页 / 共34页
Java中常见错误和异常解决方法.docx_第3页
第3页 / 共34页
Java中常见错误和异常解决方法.docx_第4页
第4页 / 共34页
Java中常见错误和异常解决方法.docx_第5页
第5页 / 共34页
点击查看更多>>
下载资源
资源描述

Java中常见错误和异常解决方法.docx

《Java中常见错误和异常解决方法.docx》由会员分享,可在线阅读,更多相关《Java中常见错误和异常解决方法.docx(34页珍藏版)》请在冰豆网上搜索。

Java中常见错误和异常解决方法.docx

Java中常见错误和异常解决方法

1.java.lang.NullPointerException

原因是:

有空指针,有地址没赋值

2.Exceptioninthread"main"java.lang.ArithmeticException:

/byzero

原因是除数是0

3.ArrayIndexOutOfBoundsException

原因是:

数组越界

4.java.lang.NumberFormatException

原因是:

数字格式化有问题

5、UnhandledexceptiontypeException

原因是:

没有进行异常处理

6.进行国际化操作的时候遇到这样的错误:

Exceptioninthread"main"java.util.MissingResourceException:

Can'tfindbundleforbasenameMessage,localezh_CN

答:

因为在命令提示符中,是没有错误的

解决方法是:

在myeclipse中,会出现这个错误java国际化之Can'tfindbundleforbasename

分类:

JAVA2011-02-2221:

17231人阅读评论(0)收藏举报

1.初步学习

最近在学习ResourseBundle时遇到了“Can'tfindbundleforbasename”这个错误搞了很久才解决了。

原因就是类路径问题要将属性文件放在类路径中!

XX里很多都是教程但没有涉及到解决方法!

2.中文显示:

测试文件

java代码

packagecom.lht.ResourseBundleStudy;

importjava.util.ResourceBundle;

publicclassResourseBundleDemo{

publicstaticvoidmain(String[]args){

ResourceBundleresource=ResourceBundle.getBundle("test");

System.out.print(resource.getString("msg0")+"!

");

System.out.println(resource.getString("msg1")+"!

");}

}

 

test.properties

msg0="HelloWorld"

msg1="dajiahao"

开始自己测试的时候:

将属性文件放在bin/下也试过也不行无赖中就在google中搜索了一下终于在sun的java论坛

I'vesolvedtheproblemthebestwaypossible.Basicallywhati'vedoneisaddedanewclassfoldernamedconfigtotheprojecthomedir.Theniaddedthisclassfoldertotheclasspathinprojectproperties.Afterdoingallofthisyouonlyneedtoreferencethepropertiesfileby"Email".

Hopethishelpsanyoneelsewhoishavingsimiliarproblems.

基本意思就是在src下建立classes(名字无所谓)文件夹将属性文件存放在下面,然后将这个文件夹加入类路径中!

运行就可以了:

加入类路径的方法:

你的工程文件夹->properties->选择Libraries选项卡->AddClassFolder将刚才建立的文件夹加入就可以了!

结果如下:

"HelloWorld"!

"dajiahao";!

2.中文显示

在classes目录下建立message_CH.properties内容如下:

ms0="大家好"

同样用上面的测试文件!

结果如下:

"?

ó"!

乱码怎么回事啊!

在XX里搜索后找到了答案有以为网友写的很清楚:

下面引用如下:

原理

Property文件中,使用的编码方式根据机器本身的设置可能是GBK或者UTF-8。

而在Java程序中读取Property文件的时候使用的是Unicode编码方式,这种编码方式不同会导致中文乱码。

因此需要将Property文件中的中文字符转化成Unicode编码方式才能正常显示中文。

解决办法

Java提供了专门的工具对Property文件进行Unicode转化,这种工具就是native2ascii,它在JDK安装环境的bin目录下。

native2ascii工具将带有本机编码字符(非拉丁1和非单一码字符)的文件转换成带有Unicode编码字符的文件。

假设需要转化的属性文件为:

D:

/src/resources.properties(含有中文字符)

转化后的属性文件为:

D:

/classes/resources.properties(中文字符统一转化为Unicode)

那么使用如下命令

JAVA_HOME/bin/native2ascii-encodingGBKD:

/src/resources.propertiesD:

/classes/resources.properties

就能将含有中文字符的属性文件转化成单一Unicode编码方式的属性文件。

中文乱码自然会被解决。

通过上面的方法我将生成的文件打开一看内容如下:

ch="/u5927/u5bb6/u597d"

再运行结果如下:

"大家好"

(2)另一种解决办法:

Can'tfindbundleforbasename

2010-09-1015:

23:

14

标签:

namefindCanbasebundle

原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处、作者信息和本声明。

否则将追究法律责任。

Struts2国际化异常处理

这是找不到指定文件;

你必须把.properties文件,放在与这个调用文件.java相同的目录里;

Hello.java在workspace\test\src\com\lj\guojiehua下

hello_en_US.properties必须在workspace\test\src下

hello_zh_CN.properties必须在workspace\test\src下

其实原因是我虽然在buildpath里面加了\pruway\source\source\config,但是系统编译的时候,在classes里面应该会自动产生resource_en_US.properties,可是实际情况是classes包下面没有产生,故我删掉重加,再编译结果发现通过了。

就是说,只要你buildpath路径对了,该路径下也有resoucebudle需要的类,那么系统会自动在classes里面自动编译产生这些类的。

所以,先检查classes里,有没有生成对应的resource_en_US.properties,如果没有,那么检查buildpath路径下有没有对应的properties类,如果有,那么证明系统编译没有编译完整,删掉path,重新addfoler,加入,再编译,检查classes下有无。

如果都有,那么证明成功。

 

10.java.lang.IllegalThreadStateException

解决办法:

不能启动两次线程

11.java.lang.NoSuchMethodError

答:

必须有一个publicstaticvoidmain(String[]args){//这里是入口}作为入口点,启动java虚拟机时虚拟机会找这个方法,如果没有就报exceptioninthread“main”java.lang.nosuchmethoderror

12..UnknownHostException:

原始出错程序是这样的:

解答方式:

import.InetAddress;

publicclassa{

publicstaticvoidmain(Stringargs[])throwsException{//所有异常抛出

InetAddresslocAdd=null;

InetAddressremAdd=null;

locAdd=InetAddress.getLocalHost();//得到本机

remAdd=InetAddress.getByName(";

System.out.println("本机的IP地址:

"+locAdd.getHostAddress());

System.out.println("MLDNJAVA的IP地址:

"+remAdd.getHostAddress());

System.out.println("本机是否可达:

"+locAdd.isReachable(5000));

}

//5000代表代数

};

运行后结果为:

如果注释掉remAdd=InetAddress.getByName(";

运行结果又是这样的:

上述程序的解决办法是:

remAdd=InetAddress.getByName(";改成

程序运行结果如下:

完成实验要求,但是这里就有一个问题了,为什么去掉http//和后面的/的就运行的了呢?

(2)但是对于这个极其相似的程序却可以运行出结果:

import.InetAddress;

publicclassb{

publicstaticvoidmain(Stringargs[])throwsException{

InetAddressaddress=InetAddress.getByName("");

System.out.println("ip:

"+address.getHostAddress());

System.out.println("host:

"+address.getHostName());

System.out.println("canonicalhostname:

"+address.getCanonicalHostName());

byte[]bytes=address.getAddress();

for(byteb:

bytes)

{

if(b>=0)System.out.print(b);

elseSystem.out.print(256+b);

}

}

}

运行结果为:

 

13.运行下列程序出现了这样的错误,这是线程的知识,一个线程如果启动了,再启动一个的时候就会报错:

java.lang.IllegalThreadStateException

程序如下:

classthrundextendsThread{

privateStringname;

publicthrund(Stringname){

this.name=name;

}

publicvoidrun(){//线程完成的动作

for(intj=0;j<4;j++){

System.out.println(name+"第"+j+"个");

}

}

};

publicclassa{

publicstaticvoidmain(Stringagrs[]){

thrundth1=newthrund("线程A");//实例化一个线程对象

th1.start();//调用线程主体

th1.start();//调用线程主体

}

};

运行结果如下:

14.Thepublictypeabcmustbedefinedinitsownfile这样的警告是出现在我下面这样的程序中的:

所以我在XX上输入这样的问题:

java程序中两个类为什么不能同时有public(其中有一个是主方法)?

得到的回答是这样的:

因为一个GM规定一个类中只能有一个PUBLIC的而且源文件的名字只能和PUBLKIC属性的类去一个名字。

另一种回答是这样的:

同个源文件有多个公共类,编译器就找不到应该执行的main方法了

15.运行下列泛型程序时,出现一下错误:

程序:

classadd{

privateTy;

publicTp(Ty){

System.out.println(y);

returny;

}

}

publicclassa{

publicstaticvoidmain(Stringargs[]){

addadder=newadd();

//System.out.println("输出属性"+adder.getX());

//adder.p("你好,邱林和");

fun(adder);

publicstaticvoidfun(add

>temp){

System.out.println("内容"+temp);

}

}

}

出现了如下错误:

其中这个voidisaninvalidtypeforthevariablefun这个错误的解释时:

第一步:

检查拼写是否错误;第二步:

检查voidactionPerformed(ActionEventae){}函数的位置,不能让它嵌套在别的函数里。

我不知道为什么,但我这样改对了。

通过这个观察上述代码确实发现这个fun方法被包含在了主方法中,所以导致这个错误,改成下列程序后,程序运行结果如下:

publicclassa{

publicstaticvoidmain(Stringargs[]){

addadder=newadd();

//System.out.println("输出属性"+adder.getX());

//adder.p("你好,邱林和");

fun(adder);

}//一开始这个}被放在了fun函数下面,所以导致了这个错误。

publicstaticvoidfun(add

>temp){

System.out.println("内容"+temp);

}

}

运行结果如下:

16.错误:

java:

Syntaxerrorontoken";",,expected

解释是这样的:

intb=3;b=b-2;应为这2行代码写的地方还处在声明定义阶段处。

就好象你脑子里想象着我有3块钱(第一行),但是又立马用这想象的3快去买物品(第二行)所以卖东西的人肯定会说你(报错).就是说,b=b-2这行代码处的位置还处于声明阶段,没有在内存中给他划分空间,你是不能操作的。

要么声明为静态的,提前划分空间

17,运行以下程序时,报错:

程序为:

publicclassa{

publicstaticvoidmain(Stringargs[]){

Runtimerun=Runtime.getRuntime();

System.out.println("JVM最大内存量:

"+run.maxMemory());

Processpro=null;//声明一个Process对象,接收启动的进程

try{

pro=run.exec("Thunder.exe");//调用本机程序,必须进行异常处理

}catch(Exceptione){//打印异常信息

e.printStackTrace();

}

try{

Thread.sleep(5000);

}catch(Exceptione){

e.printStackTrace();

}

pro.destroy();//结束此进程

}

}

运行结果为:

这一句有问题,pro=run.exec("Thunder.exe");//调用本机程序,必须进行异常处理,里面的Thunder.exe改成”notepad“就有用,不知道为什么?

(没有解决)

18.java.lang.ArrayStoreException

当运行下列程序时出现了这样的错误:

importjava.util.ArrayList;

importjava.util.Collection;

importjava.util.Iterator;

importjava.util.List;

publicclassa{

publicstaticvoidmain(Stringargs[]){

Listal=null;//定义List对象

Collectioncl=null;//定义Collention对象

al=newArrayList();//实例化List对象,只能是Integer

cl=newArrayList();//实例化Collection对象,只能是Integer

al.add(0,34);//在指定位置增加元素

al.add(1,343);

System.out.println(al);

cl.add(5654);

cl.add(3434);

System.out.println(cl);

al.addAll(cl);//从Collection继承的方法,增加一组对象

Stringstr[]=al.toArray(newString[]{});//指定的泛型类型

System.out.print("指定数组类型");//信息输出

for(inti=0;i

System.out.print(str[i]+"、");

}

System.out.print("\n返回对象数组:

");//信息输出

Objectobj[]=al.toArray();//直接返回对象数组

for(inti=0;i

Stringtemp=(String)obj[i];//每一个对象都是String类型实例

System.out.print(temp+"、");

}

}

}

程序运行结果如下:

网上的解答方式是:

当你试图将错误类型的对象存储到一个对象数组时抛出的异常。

例如,以下代码可生成一个ArrayStoreException:

Objectx[]=newString[3];x[0]=newInteger(0);就这么简单。

怎么避免呢?

关键就是元素的内容要正确。

你看你的代码:

privateObject[]objects;....objects=newObjectSet[size];很明显这里用父类的引用指向了子类的实现。

那么给每个元素赋值的时候只能付这个子类对象及这个子类的后代。

你又将OBJECT赋值给它,那么就必须向下转型。

上述程序的解决办法是:

把:

”Listal=null;//定义List对象

Collectioncl=null;//定义Collention对象

al=newArrayList();//实例化List对象,只能是Integer

cl=newArrayList();//实例化Collection对象,只能是Integer“语句中的Integer都改成String就可以了

18.addressalreadyinuse:

jvm_bind

在运行服务器和客户端程序的时候出现下面的错误:

可能运行错误的原因有:

通常出现Addressalreadyinuse:

JVM_Bind错误的可能性分析

I.就是当前端口已经有别的程序在占用着,所以要么把占用这个端口的程序关闭,要么重新换一个端口

II.端口号被占用,如果你有装oracle的话,有可能是oracle使用了8080端口,oracle安装后并且如果启动了OracleHttp服务会占用8080端口

III.我认为很可能是多启动了几次TOMCAT,在ECLIPSE下重复启动TOMCAT就会出现这个问题,你去调查一下看看是否是这个原因.

IV.如果不是windows操作系统,那么80端口已经被占用.如果是windows操作系统.请检查是否装有IIS.

V.启动了多个Tomcat。

我就是因为启动了两个Tomcat,所以才会报这样的错误,通常情况下,多次启动Tomcat或者非正常关闭Myeclipse,但是占用端口的进程没有关闭,也会出现这样的错误。

解决方法是关闭javaw.exe进程。

源程序是:

服务器端程序:

packagea;

import.*;

importjava.io.*;

publicclassServer{

privateServerSocketss;

privateSocketsocket;

privateBufferedReaderin;

privatePrintWriterout;

publicServer(){

try{

//在服务器端指定端口10000创建队列长度为50的服务器端套接字

ss=newServerSocket(10000);

while(true){

//告诉服务器不停地等待,直到有客户端连接到该Serversocket指定的端口

//一旦有客户端通过网络向该端口发送正确的连接请求

//该方法就会返回表示服务器与客户端连接已建立的Socket对象

socket=ss.accept();

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 视频讲堂

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1