try后面必须跟catch,try里面有try
java try 必须跟catch吗
有时候可以不加catch 如下
?public?void?testTryAndFinally(String?name)
?{
????????try?{
????????????name.length();//?NullPointerException
????????}?finally?{
????????????System.out.println("aa");
????????}
?}
传递null调用该方法的执行结果是:在控制台打印aa,并抛出NullPointerException。即程序的执行流程是先执行try块,出现异常后执行finally块,最后向调用者抛出try中的异常。这种执行结果是很正常的,因为没有catch异常处理器,所有该方法只能将产生的异常向外抛;因为有finally,所以会在方法返回抛出异常之前,先执行finally代码块中的清理工作。
这种做法的好处是什么呢?对于testTryAndFinally来说,它做了自己必须要做的事(finally),并向外抛出自己无法处理的异常;对于调用者来说,能够感知出现的异常,并可以按照需要进行处理。也就是说这种结构实现了职责的分离,实现了异常处理(throw)与异常清理(finally)的解耦,让不同的方法专注于自己应该做的事。
那什么时候使用try-finally,什么时候使用try-catch-finally呢?很显然这取决于方法本身是否能够处理try中出现的异常。如果自己可以处理,那么直接catch住,不用抛给方法的调用者;如果自己不知道怎么处理,就应该将异常向外抛,能够让调用者知道发生了异常。即在方法的签名中声明throws可能出现而自己又无法处理的异常,但是在方法内部做自己应该的事情。
为什么catch块要紧跟在try块后面?每个catch块可以处理几种异常?
try catch finally的设计含义就是,试运行一下程序看看会不会抛出异常来,抛出来的话,就判断是不是catch匹配的异常类型,是的话就运行catch块里面的内容,不是的话就运行finally块里面的内容
其中catch块可以有多个,用于捕获不同类型的异常
只写try 不写catch 可以吗
你要从两点上去理解
1、编译器定下的规矩(语法)
编译器定下的规矩,就是try后必须要有catch或finally,不能只出现一个try,而没有catch或者finally。你不这么做,编译器就不把你的.java文件转化为.class文件。
2、设计java语言的意图(语义)
try的意思是,接下来的代码可能会抛出异常,既然你已经表明你的意图了,那你不是该为你的意图做一些工作?有异常,你是不是该处理?怎么处理?用catch和finally。如果你不写catch和finally,那意思就是: 我知道这代码可能有异常,但是我就不处理,这不是流氓嘛,不符合逻辑。
c# try一定要catch吗?
看需求,如果你的程序存在这样的隐患,当然要写,如读写问价,肯定会打开文件流,如果出现异常了,在处理代码部分(catch)处就可以做一些补救措施,如跳转到提示页面、写入错误日志,这些都是很必要的,finally这里呢,就是无论如何都会执行的地方,看需求吧,有必要没必要不是这些人说的这样,完全看程序需求,不要妄下结论!!你想如果是一个涉及金额或积分的程序在没有写数据库事务的情况,在扣除账户金额积分时出现错误,你完全可以在异常后进行补救措施,这能说不需要吗
try{
可能出现异常的代码
}catch(Exception ex){
处理代码
}finally{
处理后无论如何都会执行的代码
}
c++中try后一定要跟catch吗
Unix(包括Linux)下的C语言编程中是不会使用try catch的,的确C也没有这个语法。然而当运行时的错误异常被抛出时,系统会产生信号发送给进程,如果进程没有做信号响应函数的话,就会被中断运行并且产生core文件,通过core文件可以查看程序的崩溃原因、当时的调用堆栈、当时的变量值等等信息,当然这是另外一个话题。
因此在Unix下,与try catch起到相似作用的东西就是信号相应函数。相关的使用方法大体包括如下内容:
1、信号安装
signal();
sigaction();
2、发送信号函数
int raise(int sig);
int pause(void);
int kill(pid_t pid,int sig);
unsigned int alarm(unsigned int seconds);
int sigqueue(pid_t pid,int sig,const union sigval val);
int setitimer(int which,const struct itimerval *value,struct itimerval *oldvalue);
void abort(void)
3、信号集及信号集操作
sigfillset(sigset_t *set);
sigemptyset(sigset_t *set);
sigaddset(sigset_t *set,int sig);
sigdelset(sigset_t *set,int sig);
4、阻塞信号相关函数
int sigprocmask(int how,const sigset_t *set,sigset_t *set);
int sigpending(sigset_t *set);
int sigsuspend(const sigset_t *set);
具体使用方法可参考相应文档