java编译声明为什么还要抛出
A. 已经捕获了异常 为什么编译时还提示“必须对其进行捕捉或声明以便抛出”
你声明的函数中声明了此函数抛出异常(public Connection getConn() throws SQLException),但是实际上函数体中在try-catch中已经将这个异常捕获(catch(SQLException ex){
System.out.println(ex.getMessage())),捕获后此函数就不能再抛出异常了,所以会提示未报告的异常的错误。只需将函数名后面的throws SQLException去掉即可。
B. java程序中的异常应该在什么时候抛出
谈谈个人理解:
大多数程序员问什么时候抛出,其实都是在纠结方法什么时候throws Exception,如果是这样,那么说明你根本还没搞懂什么是声明什么是抛出。简单的说:throws是声明,throw是抛出。
throws 一般是检查型异常,如IOExcetion等,简单点说,编译的时候就有需要声明或捕获的异常,表示此方法不处理异常,而交给方法调用处进行处理
throw 一般是抛出运行时异常(即该异常为RuntimeException的子类)。并且方法一般不需要throws Exception
API
所以我之理解:没事别瞎到方法后面加throws Exception,看着乱,因为大多都是RuntimeException;除非你真的有检查时异常你再声明给上一层处理。
主要一些自己的看法,欢迎更正,谢谢大家了
C. JAVA方法声明处的throws关键字,是说明这个方法可能有异常抛出吧可能。那为什么有些方法一定要throws呢
我不清楚是否正确理解了楼主想了解的问题,但我尽可能简略而全面的谈一谈Java语言的异常处理。
首先,Java中在一个方法内通常有两种形式的异常处理方法。
1. 在当前方法内使用try..catch..finally的语法结构捕获并处理异常
2. 在方法体前,接着方法定义后通过throws关键字,申明抛出异常
Q 为什么有这两种形式呢,或者说为什么需要处理异常?
A 即使使用的是Java或者C#等其他“高级语言”,异常的处理也在所难免。举几个例子,我们需要读取一个文本文件,正常情况下,的确不会有任何问题。但如果发生意外,比如我们想要读取的那个文件并不存在,或者还没有生成,又或者被改名了,删除了,怎么办呢?这些问题就编程语言本身而言(即使使用File.exists()或者isDir&isFile等判断,也是人力所为),他们是并不知道的。当程序运行到某一行,试图去读取一个并不存在文件的时候,异常便发生了(注意,这里说的异常通常是指Exception的普通子类,而非运行时错误或者Error),而在我们这个例子里,就会引发FileNotFoundException,又比如,如果要操作一个网络位置上的远程文件,则还有可能引发IO异常、或者网络异常等;在比如试图访问一个数组中并不存在的数据时,则会引发ArrayIndexOutOfBounds的越界异常。每当这些时候,Java的编译器和语义规则就会强制要求我们捕获并且处理它们。简单的说,程序就像小孩子,如果不这样做的话,他就不知道该怎样运行下去了(这里我用的只是一个比喻,事实上世界还存在解释型的脚本编程语言和函数式语言等,通常他们的编译器并不一定强制要求你处理所有的异常,而是在运行时碰到具体错误才告诉你)。当时,需要注意的是,养成良好的异常处理习惯,仍是一个优秀程序员的习惯。
Q 什么时候我需要在当前方法里catch然后处理,什么时候我需要throw出去?
A 举个例子,有时候,某个可能异常可能并不重要,我不想对他进行catch之后的大段处理、或者基于远程的网络操作,我们只能记录日志,我可能就会想通过自定义一个自己的Exception子类,通过在内部方法内直抛出相关异常,最后在某个具体的handler或业务逻辑层(package)在统一捕获和记录处理。总之,何时处理、何时抛出属于项目架构和基于工程角度需要思考的问题。总而言之,具体问题,具体分析。
D. java 编译 "方法声明无效;需要返回类型"怎么解决
方法返回类型未定义,如果不想返回 就 使用 void ;
修改如下:
public void My_ProcerConsumer(String s){
name=s;
}
或
public String My_ProcerConsumer(String s){
String name=“”;
name=s;
return name;
}
E. java什么异常在不需要声明就会抛出
检查性异常会在编译的同时提示出来,有的异常编译的时候没有错,但是在运行的时候会出现异常,比如数组越界,计算时候除数为0.所以你说的应该是 运行时异常
F. JAVA 写的代码里编译后报错,说未报告的异常错误需要对其捕获或申明以抛出
你的代码没有异常处理,加上异常处理。
G. java中的编译异常声明后为什么还要主动抛出
为了让外部程序抓住并处理,如果不抛出,则外部程序得不到也不知道调用程序产生了错误
H. java在编译时报错: 未报告的异常错误IOException; 必须对其进行捕获或声明以便抛出
IO异常必须捕获或者抛给JVM处理,否则编译的时候就会报错。
I. java一个疑问,为什么有些异常throw出去需要在函数头用throws声明,一些就不用。
所谓checked exception和runtime exception
checked exception告知外部用户此方法在某些情况下可能抛出这个错误,你应该捕获并处理错误以便程序在可能的情况下能够继续运行下去(当然你也可以通过throws声明将异常再往上层暴露,但终究有一层是要去catch这个异常的)。这些错误往往是可预期而且可以作为异常流来处理的。checked exception作为语法上的一种强制措施让你在代码编译阶段就必须对异常进行处理。
比如IOException,当你打开、读取、写入文件时可能抛出这个错。你可以捕获并提示最终用户‘文件操作失败,请重试’等信息,而不是任由它抛到JVM中导致当前线程挂掉。
而runtime exception可能产生于运行时的一些不可预知的时刻,而且往往产生后没有有效的手段处理,因此不需要强制对其进行声明和捕获。
你可以认为checked exception就是要强制你去处理这个异常(不管你throws多少层,你终归要在某个地方catch它);而runtime exception则没有这个限制,你可以自由选择是否catch。
=== 分割线 ===
事实上我觉得checked exception是一个非常2B的设计,很多语言中都没有这种设计。API设计并不需要这种强制处理的错误,可以通过封装返回值来做到更友好的处理。
单说Java的变种Groovy(确切来说不能叫变种,不过语法也相似)就没有这么蛋疼的设计;Scala也同样没有。
J. java编译器和解释器自身是否可以捕获异常,为什么还要使用try...catch...捕获异常
应该是JAVA虚拟机,
JAVA虚拟机可以捕捉异常,但是他不会处理异常,他的处理方法就是中止发生异常的线程,打印异常信息。
而你自己catch异常,可以尝试修复异常,而不中断程序。
另外throws是用来声明这个方法要抛出一个异常,必须跟在方法声明后面,
如public void foo() throws Exception {
//...
}
而throw是你要实际抛出一个异常时用的,如
如public int divide(int a, int b) throws Exception {
if(b == 0) {
throw new Exception("can't divide 0");
}
return a / b;
}