JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Java 新手區  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to topicthreaded modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 關於 exception 的處理
tooss3





發文: 52
積分: 0
於 2010-03-16 17:11 user profilesend a private message to usersend email to tooss3reply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int number1 = 0;
out.print("\n請輸入號碼 : ");
Scanner sc = new Scanner(System.in);
 
try
{
  number1 = sc.nextInt();
}
catch(Exception e)
{
  out.println("\n輸入的格式錯誤!!");
  exit(0);
}
 
while(number1 > choose.length || number1 <= 0)
{
  out.println("\n輸入編號錯誤,請重新輸入!");
  out.print("\n請輸入號碼 : ");
  number1 = sc.nextInt();
}


各位前輩好
以上這一小段程式是我拿來做一些例外處理的判斷
可是我有個小問題
就是在 catch(Exception e) 這行
我是用只要有 exception 發生就印出錯誤
如果使用上要比較方便的話
就不應該 exit(0) 才對
而應該是要告知使用者錯誤後
然後再次讓使用者重新輸入
這樣才合理
不過拿掉 exit(0) 的話
就又會變成發生例外了
例如 : 輸入 1.1 就會出現例外 (因為我設定輸入的東西要是 int 才是正確的)

所以我想要問的重點是
如何處理 :
發生例外後
一樣告知使用者 " 輸入的格式錯誤!! "
然後再讓使用者重新輸入

目前我只有想到用 case 這個方法去寫
可是這樣不就要把全部格式定義好
這樣不會光一個 exception 就寫到趴嗎 orz

能麻煩各位前輩能播個空解答一下嗎
謝謝


reply to postreply to post
作者 Re:關於 exception 的處理 [Re:tooss3]
smalldolphin





發文: 47
積分: 0
於 2010-03-17 09:15 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
直覺就是用個while loop...不知有無更好解法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int number1 = 0;
boolean correctInput=false ;
while(!correctInput){
    try
    {
      out.print("\n請輸入號碼 : ");
      Scanner sc = new Scanner(System.in);
      number1 = sc.nextInt();
      correctInput = true;
    }
    catch(Exception e)
    {
       out.println("\n輸入的格式錯誤!!");
       correctInput = false;
    }
}


reply to postreply to post
作者 Re:關於 exception 的處理 [Re:tooss3]
Kaworucloud





發文: 451
積分: 0
於 2010-03-17 10:00 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int number1 = 0;
Scanner sc = new Scanner( System.in );
while( true ){
  try{
    System.out.print( "請輸入號碼: " );
    number1 = sc.nextInt();
    if( number1 > choose.length || number1 <= 0 ){
      System.out.println( "編號錯誤" );
    }
    else{
      break;
    }
    sc.nextLine();
  }
  catch( Exception e ){
    System.out.println( "格式錯誤" );
    sc.nextLine();
  }
}
sc.close();


reply to postreply to post
巨乳は夢が詰まってるから大きい、貧乳はみんなに夢を与えているから小さいんだ!
作者 Re:關於 exception 的處理 [Re:tooss3]
tooss3





發文: 52
積分: 0
於 2010-03-17 11:26 user profilesend a private message to usersend email to tooss3reply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
非常感謝各位前輩播空的解答
另外我想問一下
我有問我的同學過
他目前也是在業界寫程式

他跟我說盡量別用try catch去判斷例外
因為這樣有判斷等於沒有判斷
最好能在流程中就把可能發生的例外處理掉

以上這3句話似懂有非懂
因為以前在學校寫程式完全沒有想到過
"有判斷等於沒有判斷" => 這句話我還能懂
所以對於
"最好能在流程中就把可能發生的例外處理掉" => 這句就有點不懂了
不知道有沒有大大能否舉一個簡單又懂的例子呢?
我是感覺我這一小段的程式
好像就是符合我同學說的那樣 "有判斷等於沒有判斷"

所以我同學他是說現在很少用try catch去判斷例外
因為他們老闆也不喜歡這樣寫
是不是在業界判斷例外的處理都很少用try catch呢?


tooss3 edited on 2010-03-17 11:29
reply to postreply to post
作者 Re:關於 exception 的處理 [Re:tooss3]
olife

不要做黑手



發文: 265
積分: 0
於 2010-03-17 11:40 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
exception的處理能夠在你程式發生錯誤時,
有後備的處理方式,而不至於"死當",

你朋友的意思可能是叫你在寫程式時盡量將有可能出現的bug先處理掉,
畢竟"沒有bug"總比"有bug後再處理"來的好吧?

雖然要讓程式沒有bug,還真的不太可能就是了 ==


reply to postreply to post
Don't Be Fooled By Randomness

作者 Re:關於 exception 的處理 [Re:tooss3]
mylee





發文: 764
積分: 1
於 2010-03-17 11:51 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
tooss3 wrote:
他跟我說盡量別用try catch去判斷例外
因為這樣有判斷等於沒有判斷
最好能在流程中就把可能發生的例外處理掉


你同學的說法不是很嚴謹。他的意思有可能是要做參數檢查,一開始就把不合理的參數檢查出來,不要往下執行。不過像檔案不存在或許還可以事先檢查,在 Windows 系統能執行成功的 code,到 Unix 系統也很可能失敗(例如:超出 quota,目錄/檔案無寫入權限),這種執行時期才能知道的錯誤,有些根本不太可能事先檢查(你要事先檢查剩多少 quota 然後預知要寫出多少資料嗎?即使如此,同 uid 的其它的 Java/非 Java 程式也可能吃掉 quota,怎樣也算不準的)。所以如果他是這個意思,頂多只能儘量做,不可能不用 try-catch 機制來做事後處理。

另外一種可能是他真的不會/不想寫 try-catch,那就別理會他的詁了。


reply to postreply to post
作者 Re:關於 exception 的處理 [Re:tooss3]
tooss3





發文: 52
積分: 0
於 2010-03-17 13:13 user profilesend a private message to usersend email to tooss3reply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
我也覺得要寫到沒有bug實在很難
起碼對我來說目前是這樣子
或許自己認為寫的超完美沒有bug的程式
拿給其他人一看就有可能抓出bug了
因為我技巧或是經驗不足
導致沒考慮太多東西
比我厲害的人一看就能馬上看出那裡有缺陷了

因為我目前沒有真正在寫軟體的業界待過
最近在整理大學寫過的一些作品
慢慢重新自學找回之前的記憶
一直極希望往寫java程式工作發展
再加上我同學目前是在業界工作
所以我認為他現在一定比我厲害n百倍
才會產生疑慮try catch盡量不要用??
因為他有提到過

老闆說不喜歡他用try catch來判斷例外(這裡的老闆是指PM嗎? 我沒多問題)
所以他目前是 " 很少寫到 try catch "

我只知道go不好
第一次聽到try catch盡量不要用 orz
然後我就在思考 : 那不就要把所有例外都要預先想到了嗎
那光一隻判斷例外的程式
我覺得就可以搞趴我了= =...
唉~總覺得自己離業界好遙遠 囧
當然也許是我想太多
也有可能像 mylee 大大所說的

" 他的意思有可能是要做參數檢查,一開始就把不合理的參數檢查出來,不要往下執行 "

不管怎樣還是感謝大家的解答


reply to postreply to post
作者 Re:關於 exception 的處理 [Re:tooss3]
swpoker





發文: 94
積分: 0
於 2010-03-17 13:17 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
1
2
3
4
5
6
7
8
9
      while(true){        
        try{
          System.out.println("請輸入號碼:");
          System.out.println("你輸入的號碼:"+new Scanner (System.in).nextInt());          
        }catch(Exception e){
          System.out.println("號碼輸入錯誤:");          
        }        
      }  
 


默默的成功~錯誤要拋出~不要回傳是否成功(例如 boolean doAAA())
例外儘可能的只處理一次~不確定是否要處理的錯誤就不要處理~直接拋出就好
使用uncheckexception 的方式來拋出錯誤(RuntumeException)
這是對於例外的處理的一些原則(都是看書來的拉)


swpoker edited on 2010-03-17 13:39
reply to postreply to post
» JWorld@TW »  Java 新手區

reply to topicthreaded modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8