✏️ #راه_حل
📃موضوع: رد کردن ورودی nextLine توسط اسکنر
اگه دقت کرده باشید گاهی اوقات اسکنر ورودی nextLine رو جا میذاره. این اتفاق معمولا زمانی رخ میده که شما بترتیب بخواین یک داده عددی و یک داده رشته ای رو از طریق ورودی بدست بیارید:
❌چرا همچین اتفاقی رخ میده؟
در واقع تنها داده ای که nextInt میتونه دریافت کنه، داده ی عددی هست. زمانی که شما اینتر میزنین، کاراکتر newline ایجاد میشه (یه کاراکتر برای رفتن به سر خط) و این کاراکتر داخل nextLine قرار میگیره. بهمین دلیل، از اونجا که nextLine هم پر میشه، برنامه خاتمه پیدا میکنه یا به هر صورتی ورودی رشته ای انجام نمیشه.
✅راه حل چیه؟
سه تا راه حل داریم :)
🔅راه حل یک:
اگر ورودیتون فقط یک کلمه هستش، بجای nextLine از next استفاده کنین در غیر اینصورت باقی راه حل هارو چک کنید.
🔅راه حل دو:
بعد از هر ورودی nextInt، یه ورودی nextLine خالی برای گرفتن کاراکتر newline قرار بدید:
ورودی عدد رو از طریق nextLine بخونید ولی در نهایت برای ذخیره داده، به عدد تبدیلش کنید:
int x = Integer.parseInt(scanner.nextLine());
تو راه حل دوم، با استفاده از (try catch) جهت کنترل ورودی :)
@pieceJava
📃موضوع: رد کردن ورودی nextLine توسط اسکنر
اگه دقت کرده باشید گاهی اوقات اسکنر ورودی nextLine رو جا میذاره. این اتفاق معمولا زمانی رخ میده که شما بترتیب بخواین یک داده عددی و یک داده رشته ای رو از طریق ورودی بدست بیارید:
Scanner scanner = new Scanner(System.in);
int x = scanner.nextInt();
String y = scanner.nextLine();
مثلا توی کد بالا داده عددی رو میتونید از کاربر بگیرید ولی برنامه قبل از گرفتن داده رشته ای خاتمه پیدا میکنه (امتحان کنین :) )❌چرا همچین اتفاقی رخ میده؟
در واقع تنها داده ای که nextInt میتونه دریافت کنه، داده ی عددی هست. زمانی که شما اینتر میزنین، کاراکتر newline ایجاد میشه (یه کاراکتر برای رفتن به سر خط) و این کاراکتر داخل nextLine قرار میگیره. بهمین دلیل، از اونجا که nextLine هم پر میشه، برنامه خاتمه پیدا میکنه یا به هر صورتی ورودی رشته ای انجام نمیشه.
✅راه حل چیه؟
سه تا راه حل داریم :)
🔅راه حل یک:
اگر ورودیتون فقط یک کلمه هستش، بجای nextLine از next استفاده کنین در غیر اینصورت باقی راه حل هارو چک کنید.
🔅راه حل دو:
بعد از هر ورودی nextInt، یه ورودی nextLine خالی برای گرفتن کاراکتر newline قرار بدید:
int x = scanner.nextInt();
scanner.nextLine();
String y = scanner.nextLine();
🔅راه حل سه:ورودی عدد رو از طریق nextLine بخونید ولی در نهایت برای ذخیره داده، به عدد تبدیلش کنید:
int x = Integer.parseInt(scanner.nextLine());
تو راه حل دوم، با استفاده از (try catch) جهت کنترل ورودی :)
try {
int x = Integer.parseInt(input.nextLine());
} catch (NumberFormatException e) {
e.printStackTrace();
}
#Scanner #nextInt #try_catch #NumberFormatException #nextLine@pieceJava
👍8
💎 ساختار Try With Resources
🔅 یه حالت دیگه از ترای کچ داریم به نام Try With Resources که از نسخه 7 جاوا اضافه شده.
بیشترین استفاده رو با ریسورس ها داره. ریسورس اصطلاحا به ابجکتی گفته میشه که بعد از اتمام کار لازمه که کلوز بشه. مثل فایل ها، سوکت ها و... پیش از این بستن ابجکت لازم به تعریف بخش فاینلی داشت. مثلا:
اما با Try With Resources احتیاجی به بخش فاینلی نیست و خود استیتمنت بصورت خودکار فایل رو کلوز میکنه. کلوز کردن فایل میتونه جلوی خیلی از مشکلات از جمله خراب شدن فایل و ... رو بگیره.
🔅 باز نویسی کد بالا با ساختار ترای ویز ریسورسز:
@pieceJava
🔅 یه حالت دیگه از ترای کچ داریم به نام Try With Resources که از نسخه 7 جاوا اضافه شده.
بیشترین استفاده رو با ریسورس ها داره. ریسورس اصطلاحا به ابجکتی گفته میشه که بعد از اتمام کار لازمه که کلوز بشه. مثل فایل ها، سوکت ها و... پیش از این بستن ابجکت لازم به تعریف بخش فاینلی داشت. مثلا:
FileWriter fw = null;بخش فاینلی چه درصورتی که برنامه دارای خطا یا چه بدون خطا بود در هر صورت اجرا میشه.
try{
fw = new FileWriter("....txt");
...
}catch(IOException e){
...
}finally{
fw.close();
}
اما با Try With Resources احتیاجی به بخش فاینلی نیست و خود استیتمنت بصورت خودکار فایل رو کلوز میکنه. کلوز کردن فایل میتونه جلوی خیلی از مشکلات از جمله خراب شدن فایل و ... رو بگیره.
🔅 باز نویسی کد بالا با ساختار ترای ویز ریسورسز:
try(FileWriter fw = new FileWriter("...txt")){
...
}catch(IOException e){
...
}
#Try_Catch #Try_With_resources #File #IO #FileWriter #close #Exception@pieceJava