Java中常见错误和异常解决方法打印要点.docx
- 文档编号:3812142
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:33
- 大小:212.09KB
Java中常见错误和异常解决方法打印要点.docx
《Java中常见错误和异常解决方法打印要点.docx》由会员分享,可在线阅读,更多相关《Java中常见错误和异常解决方法打印要点.docx(33页珍藏版)》请在冰豆网上搜索。
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
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
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
.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[]){
add
//System.out.println("输出属性"+adder.getX());
//adder.p("你好,邱林和");
fun(adder);
publicstaticvoidfun(add
>temp){
System.out.println("内容"+temp);
}
}
}
出现了如下错误:
其中这个voidisaninvalidtypeforthevariablefun这个错误的解释时:
第一步:
检查拼写是否错误;第二步:
检查voidactionPerformed(ActionEventae){}函数的位置,不能让它嵌套在别的函数里。
我不知道为什么,但我这样改对了。
通过这个观察上述代码确实发现这个fun方法被包含在了主方法中,所以导致这个错误,改成下列程序后,程序运行结果如下:
publicclassa{
publicstaticvoidmain(Stringargs[]){
add
//System.out.println("输出属性"+adder.getX());
//adder.p("你好,邱林和");
fun(adder);
}//一开始这个}被放在了fun函数下面,所以导致了这个错误。
publicstaticvoidfun(add
>temp){
System.out.println("内容"+temp);
}
}
运行结果如下:
16.错误:
java:
Syntaxerrorontoken";",,expected
17.解释是这样的:
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[]){
List
Collection
al=newArrayList
cl=newArrayList
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赋值给它,那么就必须向下转型。 上述程序的解决办法是: 把: ”List Collection al=newArrayList cl=newArrayList 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(); StringclientIP=socket.getInetAddress().getHostAddress(); StringclientPort=": "+socket.getLocalPort(); System.out.println("Aclientcomein! IP: "+clientIP+clientPort); //获得客户端发送的信息 in=newBufferedReader(new
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 常见 错误 异常 解决方法 打印 要点
![提示](https://static.bdocx.com/images/bang_tan.gif)