iT邦幫忙

0

java 例外處理 急!!!!!

  • 分享至 

  • xImage

import java.util.* ;
public class HWK7_01 {
static Random r = new Random(222) ;
public static void main(String[] args) {
int v = 10 ;
System.out.println("v="+v) ;
// DIY, 呼叫genExp()10次,依照每次傳回之例外訊息,對v進行運算
// (a)若訊息為"add x" (x是個整數),則將v加上x
// (b)若訊息為"sub x" (x是個整數),則將v減去x
// (c)若訊息為"mul x" (x是個整數),則將v乘上x
try{
for (int i=0; i<10; i++) {
genExp() ;
}
}catch(Exception e) {
for (int i=0; i<10; i++) {
System.out.println(e.getMessage()) ;
}
String[] s = e.getMessage().split("\s+") ;
if(s[0].equals("add")) {
v+=Integer.valueOf(s[1]) ;
}else if(s[0].equals("sub")) {
v-=Integer.valueOf(s[1]) ;
}else if(s[0].equals("mul")) {
v*=Integer.valueOf(s[1]) ;
}
}

    System.out.println("v="+v) ;
}

public static void genExp() throws Exception{ 
    // [功能]: 先以上面的亂數物件r產生二個整數n1(1~9), n2(1~10)
    //        考慮n1, 若介於[1-3],則丟回一例外,內含訊息"add "+n2
    //        考慮n1, 若介於[4-6],則丟回一例外,內含訊息"sub "+n2
    //        考慮n1, 若介於[7-9],則丟回一例外,內含訊息"mul "+n2
	// DIY here
        int n1 = r.nextInt(9)+1 ;
        int n2 = r.nextInt(10)+1 ;
        if(n1>=1 && n1<=3) {throw new Exception ("add "+n2) ;}
        if(n1>=4 && n1<=6) {throw new Exception ("sub "+n2) ;}
        if(n1>=7 && n1<=9){throw new Exception ("mul "+n2) ;}
}

}
/* [程式輸出]
v=10
sub 2
mul 9
add 10
mul 3
add 10
mul 1
mul 3
add 5
sub 2
add 7
v=778
*/
https://ithelp.ithome.com.tw/upload/images/20211130/20144400dr5269w5TW.jpg

跑出來的結果如圖,為甚麼會一直困在第一項sub 2裡面?

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
3
海綿寶寶
iT邦大神 1 級 ‧ 2021-11-30 23:27:45

先別急

https://ithelp.ithome.com.tw/upload/images/20211201/20001787joo3JF4IOR.png

1
qaz11226633
iT邦新手 4 級 ‧ 2021-12-01 08:19:37

1.你的Try Catch寫錯位置
2.Catch 不用跑

for (int i=0; i<10; i++) {
System.out.println(e.getMessage()) ;
}

這是你的正解

import java.util.* ;
public class HWK7_01 {
static Random r = new Random(222) ;
public static void main(String[] args) {
int v = 10 ;
System.out.println("v="+v) ;
// DIY, 呼叫genExp()10次,依照每次傳回之例外訊息,對v進行運算
// (a)若訊息為"add x" (x是個整數),則將v加上x
// (b)若訊息為"sub x" (x是個整數),則將v減去x
// (c)若訊息為"mul x" (x是個整數),則將v乘上x
for (int i=0; i<10; i++) {
try{
genExp() ;
}catch(Exception e) {
System.out.println(e.getMessage()) ;
String[] s = e.getMessage().split("\\s+") ;
if(s[0].equals("add")) {
v+=Integer.valueOf(s[1]) ;
}else if(s[0].equals("sub")) {
v-=Integer.valueOf(s[1]) ;
}else if(s[0].equals("mul")) {
v*=Integer.valueOf(s[1]) ;
}
}
}
    System.out.println("v="+v) ;
}

public static void genExp() throws Exception{ 
    // [功能]: 先以上面的亂數物件r產生二個整數n1(1~9), n2(1~10)
    //        考慮n1, 若介於[1-3],則丟回一例外,內含訊息"add "+n2
    //        考慮n1, 若介於[4-6],則丟回一例外,內含訊息"sub "+n2
    //        考慮n1, 若介於[7-9],則丟回一例外,內含訊息"mul "+n2
	// DIY here
        int n1 = r.nextInt(9)+1 ;
        int n2 = r.nextInt(10)+1 ;
        if(n1>=1 && n1<=3) {throw new Exception ("add "+n2) ;}
        if(n1>=4 && n1<=6) {throw new Exception ("sub "+n2) ;}
        if(n1>=7 && n1<=9){throw new Exception ("mul "+n2) ;}
}
}

izjsbsh程式邏輯,要再加油唷! 祝你進步

1

因為 try 執行間若有報錯迴圈會中斷並跑到 catch 裡面執行
你在 catch 執行迴圈等於將相同錯誤訊息重複打印出來
所以才會是相同結果
將迴圈改放在 try catch 外面即可

我要發表回答

立即登入回答