ورود

View Full Version : سوال: دلیل استفاده از ()next توی این کد؟



vahid1993
سه شنبه 05 اردیبهشت 1396, 11:04 صبح
سلام به همگی!
توی این متد ساده کاربر شعاع دایره وارد میکنه و محیطش براش حساب میشه.


import java.util.Scanner;


public class B {
public static void circlPermeter() {
Scanner sc = new Scanner(System.in);
double radiuse = 0;
boolean check = false;
do{
System.out.println("enter a number :");
if(sc.hasNextDouble()){
radiuse = sc.nextDouble();
check = true;
}else{
System.out.println("wrong number ");
check = false;
sc.next();
}
}while(!check);

System.out.println(2 * Math.PI * radiuse);
}
}


حالا میخام بدونم چرا اینجا باید از ()next استفاده کرد که به کاربر اجازه بده بازم عدد وارد کنه ؟ چرا وقتی ()nextDouble میزنیم بجاش اررو میده. کلا next چه فرقی با بقیه میکنه؟


}else{
System.out.println("wrong number ");
check = false;
sc.next();
}


با تشکر فراوان

vahid-p
سه شنبه 05 اردیبهشت 1396, 23:33 عصر
یکی از مزایا (و گاها عیب محسوب میشه) که جاوا روی نوع داده ها (Type) خیلی سختگیره و مثل زبانهایی نیست که خودشون تشخیص بدن و انواع داده ها رو هر گاه لازم دیدن cast یا convert کنند.
برای همین اگر شما از IDE استفاده کنید هر متدی که مینویسید خروجیش رو هم میبینید.
اگر دقت کنید مقدار خروجی next در این کلاس (Scanner) مقدار String است. ولی nextDouble مقدار برگشتی double یا شاید Double باشه.
وقتی شما از کیبورد میخونید هر چیزی در ابتدا String هست و در نتیجه شما به هیچ خطایی بر نمیخورید. اما اگر از nextDouble استفاده کنید فقط مجاز هستید یک عدد (صحیح یا اعشاری) وارد کنید و اگر فرمتش متفاوت باشه یا بینش حروف مثل a و... باشه خطا میگیره. چون ابتدا رشته رو میگیره و بعد به عددی از نوع double تبدیل میکنه.

تو خطی که شما گفتید، خب شما در if گفتید اگر بعدی hasNextDouble نبود، اونوقت به صورت رشته بگیر (و البته جایی ذخیره نکن). خب شما میگید چرا nextDouble بذارم اررور میده. مسلمه وقتی چک کردید که double نبود برو تو else بعد اونجا nextDouble کنید؟