在編程過程中,很多技術人員看重程序的簡潔性,效率性和包容性。其中最容易問到的就是假如輸入數據不符合要求時的程序處理,這也是很多公司的機試題中應聘人員寫出了符合功能要求的程序卻並未通過面試的原因。下面是本人在刷《劍指offer》的過程中遇到的第一個問題,java中使用Scanner進行輸入時,關於判定用戶輸入數據是否符合數據類型要求的處理的問題。
比如編程題中要求程序判定用戶輸入的數是否為水仙花數。
題意中雖然並沒有特意說明數據類型,通常我們會采用int型變量作為程序中的主要參數,很多程序員在面試過程中拿到題目便不假思索,洋洋灑灑的寫出了簡潔高效的代碼,但是最后卻被通知機試不通過。有可能就是面試官希望在程序中看到關於異常情況的處理,但是程序員提交的答案卻完全沒有考慮到這點。
我在剛接觸輸入驗證的過程中看到網友介紹了很多方法,篩選過后認為一下方法是最適合初學者的。
假如已知程序中定義的基本數據類型為int型,需要寫出輸入驗證的處理過程是“當用戶輸入非整數的時候便一直提醒用戶輸入整數,直到正確輸入再進行后續操作”。
於是我在一開始寫下的代碼如下:
1 import java.util.Scanner; 2 3 public class test { 4 public static void main(String[] args){ 5 Scanner sc=new Scanner(System.in); 6 int num; 7 while(true){ 8 if (sc.hasNextInt()){ 9 num=sc.nextInt(); 10 break; 11 }else{ 12 System.out.println("輸入錯誤,請重新輸入整數:"); 13 } 14 } 15 } 16 }
該代碼的思路是在while循環里用if判斷輸入的是否為整數,如果是整數則將該值賦值給num,跳出循環,如果不是整數則打印“輸入錯誤,請重新輸入整數:”,實際上,因為while循環的判定語句是true,始終成立,所以while循環體內的語句會無限循環,所以一旦接收到非整數的輸入,則會無限打印上面的提示文字。
該代碼中需要改正的問題就是要將hasNextInt()的判定放在while循環的判定中,只有輸入為整數的時候循環才會結束,並且因為hasNexInt()判定完輸入的數據后並不會將標記移動到下一行,所以循環的過程中並不會再次判斷輸入的數據是否為整數,只會繼續往后執行打印提示文字的語句。想要把標記移動到下一行重新判斷用戶再次輸入的數據是否符合要求需要用next(),改進后的代碼如下:
import java.util.Scanner; public class test { public static void main(String[] args){ Scanner sc=new Scanner(System.in); int num; while(!sc.hasNextInt()){ sc.next(); System.out.println("輸入錯誤,請重新輸入整數:"); } num=sc.nextInt(); System.out.println("你輸入的是:"+num); } }
