Java异常处理中关键字throws,throw,try,catch,finally分别代表啥意义?在try块中可以抛出异常吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java异常处理中关键字throws,throw,try,catch,finally分别代表啥意义?在try块中可以抛出异常吗相关的知识,希望对你有一定的参考价值。

参考技术A 这是我以前做的额,运行在tc上运行可以,因为atoi()(字符转数值)是tc的库函数,在c++6.0上会报错,其实很简单,自己都可以编一个。刚开始运行没有提示,忘记了,输入表达式回车就行了。基本思想是将中缀表达式利用栈转成后缀表达式,再求值。
#include<stdio.h>
#define max 100
typedef long datatype;
typedef char chartype;
typedef struct

datatype data[max];
int top;
numstack;/*对象栈用于存储运算对象*/
typedef struct

chartype data[max];
int top,y[max];/*y中存储对应运算符的优先级*/
stack;/*运算符栈用于存储运算符*/

int fenli(numstack *S,char string[max],int i)
/*将运算对象从表达式中取出转换为数值并存储在对象栈中*/

int j=0;
char st[100];/*st用于暂时存储字符类型的运算对象*/
do

st[j]=string[i];i++;j++;
while(string[i]>='0'&&string[i]<='9');/*将运算对象从表达式中取出存储在st中*/
st[j]='\0';
S->top++;
S->data[S->top]=atoi(st);/*atoi的作用是将字符串转换为对应的数值,将转换后的数值存储在对象栈中*/
j=0;
return(i);/*将当前字符的位置返回*/


int pipei(char string[max])
/*验证括号是否匹配*/

stack *S;
int i=0;
S->top=0;/*初始化运算符栈*/
while(string[i]!='\0')

if(string[i]=='(')/*遇到'('将'('入栈*/

S->top++;
S->data[S->top]=string[i];

if(string[i]==')')/*遇到')',判断栈顶是否'(',如果是则将栈顶出栈,否则括号不匹配返回0*/
if(S->data[S->top]=='(')
S->top--;
else return(0);
i++;

if(S->top>0) return(0);/*判断运算符栈是否为空,不为空则括号不匹配返回0,为空则括号匹配返回1*/
else return(1);

void yunsuan(char string[max])

numstack *S;
int i=0;
S->top=0;/*初始化对象栈*/
while(string[i]!='\0')/*如果是结束符,结束循环*/

if(string[i]>='0'&&string[i]<='9')/*如果当前字符是运算对象,调用fenli函数将运算对象分离出来,并转换为对应数值*/
i=fenli(S,string,i);
else
/*如果是运算符,则将对象栈中栈顶俩个运算对象做对应的运算,将结果压入对象栈*/
switch(string[i])

case ' ':
case '+':
case '-':
case '*':
case '/':


i++;/*扫描下一字符*/


printf("表达式运算结果为: %ld \n",S->data[S->top]);


int zhuanghuan(char s[max],char string[max])
/*将中缀表达式转换为后缀表达式*/

stack *S;
int i=0,j=0;
S->top=-1;
S->y[0]=0;/*初始化运算符栈*/
while(s[i]!='\0')/*遇到结束符结束循环*/

if(s[i]>='0'&&s[i]<='9')/*遇到运算对象*/

string[j]=s[i];/*将运算对象存入转换后的字符串中*/
j++;

else switch(s[i])


case '(':/*遇到'(',直接入运算符栈*/
S->top++;
S->data[S->top]='(';
S->y[S->top]=0;/*'('在括号内运算优先级最低,在括号外最高*/
break;

case ')':/*遇到')',将运算符栈的运算符出栈,直到遇到'('为止,将'('直接出栈*/

while(S->data[S->top]!='(')

string[j]=S->data[S->top];
S->top--;j++;

S->top--;break;

case '+':
case '-':
string[j]=' ';/*将运算对像用间隔开*/
if(S->y[S->top]>=1)/*如果栈顶元素的优先级大于+-的优先级1,则将栈顶元素出栈*/

string[j]=S->data[S->top];
S->top--;

S->top++;
S->data[S->top]=s[i];/*将当前运算符+或-入栈*/
S->y[S->top]=1;/*+-的优先级定义为1*/
j++;break;

case '*':
case '/':
string[j]=' ';
if(S->y[S->top]>=2)/*如果栈顶元素的优先级大于等于*或/的优先级,则将栈顶元素出栈*/

string[j]=S->data[S->top];
S->top--;

S->top++;
S->data[S->top]=s[i];/*将当前运算符*或/入栈*/
S->y[S->top]=2;/*优先级定义为2*/
j++;break;



i++;

while(S->top!=-1)/*若栈不为空,出栈直到栈空*/

string[j]=S->data[S->top];S->top--;j++;

string[j]='\0';
printf("后缀表达式为:%s\n",string);
return(1);


int main()


char string[max],s[max],flag='1';
while(flag!='0')

printf("");
gets(s);
if(pipei(s))

if(zhuanghuan(s,string))
yunsuan(string);

else printf("bupipei");
printf("结束输入0,输入任意字符继续");
scanf("%c",&flag);

Java基础异常处理关键字:try catch finally throw throws

  嗨咯,大家晚上好,我的博客首篇开始了 ,我们一起加油吧!

都说java 语言是非常健壮性 如:垃圾回收机制、内存模型、异常处理,强类型转换、跨平台,等等,使得Java语言的受到青睐。今天我们先来聊聊java的异常处理机制try catch finally throw throws,平时我们貌似小瞧了这五个关键字。开发应用系统,良好异常的处理对系统后期的开发、维护、升级、用户的体验尤其重要。

异常有个非常重要的特征,从出现异常的位置 到 最顶端的main方法 如果你一直没catch到它,最终jvm会帮你抛出异常信息,糟糕的是该线程断掉,后续代码也不再执行,从此无声无息的消失在jvm这片汪洋大海。前面我公司的一个项目前端ajax请求control做支付,由于control的catch里面抛出了一个空指针,导致前端页面卡住不动了,解决方案:由于control层一般是顶层最好catch到任何有可能出现异常的地方,其他非顶层还可以继续throw 或者throws往上抛。还有就是最好为每个ajax设置超时时间。

 

先简单介绍下throw 跟throws:

throw :在方法体内抛出一个异常,实际存在的异常对象,一般用是自己扩展的异常实例,throws是放在方法名后面,表示该方法如果出现异常 , 我不想处理或者处理不了,交给调用者处理,可以thow抛出一个运行时异常(unchecked)如ClassNotFoundException,NumberFromartException,   也可以throws或throw+try或throw+throws 处理一个checked异常如:IOExcepion,SocketException、继承exception类之类的异常, 。区别是checked异常必须处理(要么try,要么throws继续往上抛,否则编译是通不过的),而运行时异常可以不处理,一直不处理的后果是出现异常后jvm报出异常信息然后线程断掉。 throw 跟throws关键字一般情况不建议在代码中使用,推荐所有异常就地解决。知道用就行了,不做过多的讲解。

try的组合规则:1, try{}catch(){}  2,try{}catch(){}finally{}  3,try{}finally{}    ,1跟2的方式 catch可以有多个

 

朋友,吃几颗栗子:

1,无try组合  

public class CatchExecuteJustOne {
  public void methodOne(){
    System.out.println("into methodOne method");
    int one=1/0;
    System.out.println("end methodOne method"); //不会输出  没有try组合,报错后线程已经断掉
}
  public static void main(String[] args) {
    CatchExecuteJustOneS cejo = new CatchExecuteJustOneS();
    cejo.methodOne();

    System.out.println("end  main method"); //不会输出  没有try组合 报错线程已经断掉
  }
}

输出:

Into methodOne method
Exception in thread "main" java.lang.ArithmeticException: / by zero
at priv.lilei.exception.example_1.CatchExecuteJustOneS.methodOne(CatchExecuteJustOneS.java:6)
at priv.lilei.exception.example_1.CatchExecuteJustOne.main(CatchExecuteJustOne.java:19)

 

2.1,有try组合案例1

public class CatchExecuteJustOne {
  public void methodOne(){
    System.out.println("into methodOne method");
  try{
    int one=1/0;
  }catch(Exception e){
    System.out.println("methodOne try到");
  }
  System.out.println("end methodOne method");
}

  public static void main(String[] args) {
    CatchExecuteJustOne cejo = new CatchExecuteJustOne();
    cejo.methodOne();
    System.out.println("end main method");
  }
}

 输出:

into methodOne method
methodOne try到
end methodOne method
end main method

2.2,有try组合案例2

public class CatchExecuteJustOne {
public void methodOne(){
  System.out.println("into methodOne method");
  int one=1/0;
  System.out.println("end methodOne method"); //不会执行线程上面报错断掉直接抛出了
}

public static void main(String[] args) {
  try{
    CatchExecuteJustOne cejo = new CatchExecuteJustOne();
    cejo.methodOne();
  }catch(Exception exception){
    System.out.println("into main method catch"); //会执行 try到上面方法报的异常
  }
    System.out.println("end main method"); //会执行 try到上面方法报的异常
 }
}

输出:

into methodOne method
into main method catch
end main method

 

2.3,有try案例组合3    异常只会被最近捕捉到它的catch 一次。像switch case 跟if() if else(){} if()else if{} 语法一样

 

public class CatchExecuteJustOne {
public void methodOne(){
System.out.println("into methodOne method");
try{
int one=1/0;
}catch(ArithmeticException e){
System.out.println("catch 1");
}catch (Exception e) {
System.out.println("catch 2");//不会执行 已经执行了上一个catch 1
}
}

public static void main(String[] args) {
CatchExecuteJustOne cejo = new CatchExecuteJustOne();

try {
cejo.methodOne();
} catch (Exception e) {
System.out.println("man catch");//不会执行已经执行了catch 1
}

System.out.println("end main method");
}
}

输出:

into methodOne method
catch 1
end main method

2.4 有try组合案例4,  try{}finally{}组合,finally没中有返回值得时候线程会断掉,但在finally中有返回值时候线程不会断掉只是后续代码不会执行, 这种组合建议少用。

 //没返回值

public class CatchExecuteJustOne {
  public void methodOne(){  //没返回值
    System.out.println("into methodOne method");
  try{
    int one=1/0;
  }finally{
    System.out.println("into methodOne finally");
  }
    System.out.println("end methodOne method"); //不会执行线程上面报错断掉直接抛出了
}

public static void main(String[] args) {
  CatchExecuteJustOne cejo = new CatchExecuteJustOne();
  cejo.methodOne();
  System.out.println("end main method");//不会执行线程上面报错断掉直接抛出了
  }
}

没返回值的输出:

into methodOne method
Exception in thread "main" into methodOne finally
java.lang.ArithmeticException: / by zero
at priv.lilei.exception.example_1.CatchExecuteJustOne.methodOne(CatchExecuteJustOne.java:14)
at priv.lilei.exception.example_1.CatchExecuteJustOne.main(CatchExecuteJustOne.java:23)

有返回值:

public class CatchExecuteJustOne {
public String methodOne(){
System.out.println("into methodOne method");
try{
System.out.println("1");
int one=1/0;
System.out.println("2");//不会执行线程上面报错断掉直接抛出了
}finally{
System.out.println("into methodOne finally");//会输出
return "1";
}
}

public static void main(String[] args) {
CatchExecuteJustOne cejo = new CatchExecuteJustOne();
cejo.methodOne();
System.out.println("end main method");//会执行 因为上面有try到并且方法有返回值
}
}

有返回值的输出:

into methodOne method
1
into methodOne finally
end main method

 

2.5,带finally的组合  finally永远被执行,有返回值得情况在返回之前执行,  除非出现特别暴力的行为如 system.exit(0); 或者断掉了,或者内存溢出了等Error错误。

return 组合

2.5.1 下面两个案例  在没有异常 跟有异常的情况  ,在catch跟finally 中给变量再次赋值   存在差异。没有异常再次赋值失败,而有异常再次赋值成功。

 

1 没有异常的情况 

public class CatchExecuteJustOne {
public String methodOne(){
String a="";
System.out.println("into methodOne method");
try{
a="a";
return a;
}catch(ArithmeticException e){
System.out.println("catch 1");
}finally {
System.out.println(1);
a="a2";        //不报错的情况   不会赋值给a;
System.out.println(2);
}
System.out.println(3); //不会执行 上面return a方法已经返回了
return a;
}

public static void main(String[] args) {
CatchExecuteJustOne cejo = new CatchExecuteJustOne();
System.out.println(cejo.methodOne());
}
}

try中return 没有异常的情况的输出:

into methodOne method
1
2
a

2 有异常的情况

public class CatchExecuteJustOne {
public String methodOne(){
String a="";
System.out.println("into methodOne method");
try{
a="a";
int i=1/0;
return a;
}catch(ArithmeticException e){
System.out.println("catch 1");
}finally {
System.out.println(1);
a="a2";   //有异常会重新赋值给a 变量
System.out.println(2);
}
System.out.println(3); //会输出 捕捉到了异常没有从上面第一个return a返回 而是从下面这个return返回
return a;
}

public static void main(String[] args) {
CatchExecuteJustOne cejo = new CatchExecuteJustOne();
System.out.println(cejo.methodOne());
}
}

try中return 有异常的情况输出:

into methodOne method
catch 1
1
2
3
a2

 






































































































































































以上是关于Java异常处理中关键字throws,throw,try,catch,finally分别代表啥意义?在try块中可以抛出异常吗的主要内容,如果未能解决你的问题,请参考以下文章

JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表啥意

Java学习笔记3.10.4 异常处理 - throw关键字

Java面试题22 JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?

JAVA语言如何进行异常处理,关键字throws,throw,try,catch,finally分别代表啥意义在try块中抛出异常吗

Java中throw和throws的区别

JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表啥意义?