الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيفية التعامل مع InputMismatchException

بدأه khaled_prg في 16 أبريل 2012 · 13 رد · 911 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

أريد كتابة كود يطلب من المستخدم إدخال عدد ثم يتحقق من صحة الإدخال, إذا كان المُدخل خاطئ سيدخل البرنامج في حلقة و يستمر في طلب إدخال جديد حتى يتحقق المطلوب.

هذه محاولتي :

import java.util.Scanner;
import java.util.InputMismatchException;

public class Try_Catch {

    static boolean IsDigit(char x) {
        return x >= 0x30 || x <= 0x39;
    }

    static boolean IsString(String str) {
        for (int i = 0; i < str.length(); i++) {
            if (!IsDigit(str.charAt(i))) {
                return false;
            }
        }
        return true;
    }
    public static void main(String[] args){
        Scanner src = new Scanner(System.in);
        String X;
        int i;
        try{
            System.out.println("Tapez un Nombre : ");
            i = src.nextInt();   
            System.out.println("Vous avez entré : "+i);
        }
        catch(InputMismatchException e){
            do{
                System.out.println("Erruer, Recommecez à nouveau : ");
                i = src.nextInt();
                X = String.valueOf(i);
            }while(!IsString(X));
        }
        System.out.println("Merci, c'est bien");
    }
}

أرجو التصحيح و شكرا.

تم تعديل هذه المشاركة بواسطة khaled_prg في 16 أبريل 2012 في 17:12

#2
package newpackage;

/**
 *
 * @author
 */
import java.util.InputMismatchException;
import java.util.Scanner;

public class Try_Catch {

    static boolean IsDigit(char x) {
        return x >= 0x30 || x <= 0x39;
    }

    static boolean IsString(String str) {
        for (int i = 0; i < str.length(); i++) {
            if (!IsDigit(str.charAt(i))) {
                return false;
            }
        }
        return true;
    }

    public static void main(String[] args) {
        while (true) {
            Scanner src = new Scanner(System.in);
            String X = null;
            int i;
            try {
                System.out.println("Tapez un Nombre : ");
                i = src.nextInt();
                System.out.println("Vous avez entré : " + i);
                System.out.println("Merci, c'est bien");
            } catch (InputMismatchException e) {
                do {
                    System.out.println("Erruer, Recommecez à nouveau : ");
                    try {
                        i = src.nextInt();
                         X = String.valueOf(i);
                    } catch(Exception ex)  {
                        System.out.println("Plaese insert Integer number");
                    }
                   break;
                } while (true);
            }

        }
    }
}

أرجو أن يكون هذا هو المطلوب أخي الفاضل

بالتوفيق

برنامج Online Exam مفتوح المصدر

 

To Info:abdelrahman.awad@yahoo.com

 

 

\

#3

لم أفهم هذا السطر

 x >= 0x30 || x <= 0x39
#4
اقتباس
أرجو أن يكون هذا هو المطلوب أخي الفاضل

شكرا لمساعدتك أخي الكريم :)

لكن الكود يستمر في طلب الإدخال من المستخدم حتى لو أدخل المستخدم عددا صحيحا !!

+

مالحاجة إلى try-catch الثانية ؟

اقتباس
لم أفهم هذا السطر
حسب جدول ASCII فإن ترميز الأرقام (0,1,2,3,4,5,6,7,8,9) يبدأ من 48 و حتى 57, القيمة 0x30 تُقابل 48 في النظام السداسي عشر أو الهكس و نفس الشيء مع 0x39 و 57.

تم تعديل هذه المشاركة بواسطة khaled_prg في 16 أبريل 2012 في 23:07

#5
اقتباس
شكرا لمساعدتك أخي الكريم :)

لكن الكود يستمر في طلب الإدخال من المستخدم حتى لو أدخل المستخدم عددا صحيحا !!

+

مالحاجة إلى try-catch الثانية ؟

يمكن لك يا أخي الفاضل عندما يجد الإجابه الصحيحه ان تقوم بعمل break;

if(value==true)

break;

else

وهكذا .....

أتمنى أن أكون قد أفدتك:)

برنامج Online Exam مفتوح المصدر

 

To Info:abdelrahman.awad@yahoo.com

 

 

\

#6

أشكرك على المتابعة :)

اقتباس
يمكن لك يا أخي الفاضل عندما يجد الإجابه الصحيحه ان تقوم بعمل break;

if(value==true)

break;

else

وهكذا .....

كيف ذلك ؟

ملاحظة : إذا أمكن معاجلة المشكلة دون تداخل الــ Exception فهذا أحسن.

تم تعديل هذه المشاركة بواسطة khaled_prg في 17 أبريل 2012 في 00:02

#7

السلام عليكم

تم بحمد الله حل المشكة و هذا هو الكود الجديد :

import java.util.Scanner;
import java.util.InputMismatchException;

public class Try_Catch {

    static boolean IsDigit(char x) {
        return x >= 0x30 & x <= 0x39;
    }

    static boolean IsString(String str) {
        for (int i = 0; i < str.length(); i++) 
            if (!IsDigit(str.charAt(i))) 
                return false;
        return true;
    }

    public static void main(String[] args) {
        Scanner src = new Scanner(System.in);
        String X;
        int x;
        try {
            System.out.println("Tapez un Nombre : ");
            x = src.nextInt();
        } catch (InputMismatchException e) {
            X = src.nextLine();
            while (!IsString(X)) {
                System.out.println("Erreur, Recommencez à nouveau : ");
                X = src.nextLine();
            }
            x = Integer.parseInt(X);
        }
        System.out.println("Merci, c'est bien, Vous avez entré : " + x);
    }
}

الشرط x >= 0x30 || x <= 0x39 غير كافي لضمان وجود كود الــ ASCII في منطقة الأرقام لذا قمتُ بإبداله بــ &.

بالتوفيق.

تم تعديل هذه المشاركة بواسطة khaled_prg في 17 أبريل 2012 في 16:54

#8

السلام عليكم

مرحباً خلود ... ربنا معاك وتخلص الإمتحانات على خير إن شاء الله

شوف الكود ده على السريع بدون معالجة الإثتثنائات وبدون ما تعصب نفسك وتستخدم النظام السادس عشر biggrin.gif

import java.util.Scanner;
import java.util.InputMismatchException;

public class Try_Catch {

	static boolean IsDigit(String str) {
    	int i=0;
    	while(i!=str.length()){
        	if(str.charAt(i)>57||str.charAt(i)<47) return false;
        	i++;
    	}
    	return true;
	}


	public static void main(String[] args) {
    	Scanner src = new Scanner(System.in);
    	String X;
    	int x=0;
    	System.out.println("Tapez un Nombre : ");
        	X = src.nextLine();
        	while (!IsDigit(X)) {
            	System.out.println("Erreur, Recommencez à nouveau : ");
            	X = src.nextLine();
        	}
        	x = Integer.parseInt(X);
    	System.out.println("Merci, c'est bien, Vous avez entré : " + x);
	}
}
1

لاتحسبن العلم ينفع وحده مالم يتوج ربه بخلاق

لا إله إلا أنت سبحانك إني كنت من الظالمين

#9

و عليكم السلام

اقتباس
مرحباً خلود ... ربنا معاك وتخلص الإمتحانات على خير إن شاء الله

شوف الكود ده على السريع بدون معالجة الإثتثنائات وبدون ما تعصب نفسك وتستخدم النظام السادس عشر :D

مرحبا أبو حميد :)

الهدف من الكود هو التعود على استعمال الإستثناءات لذا كان لا بد من استخدامها :happy:

أما ما يتعلق بنظام الهكس فأحب دائما أن أتعامل معه (على طريقة أخونا محمد علاء الدين :D)

#10
اقتباس

الشرط x >= 0x30 || x <= 0x39 غير كافي لضمان وجود كود الــ ASCII في منطقة الأرقام لذا قمتُ بإبداله بــ &.

اهلا خالد

اولا هذه bitwise and وليست logical and

&

ثانيا اقترح عليك ان تتعامل مع الحرف مباشرة دون ربطه برقم من جدول الترميز لأنه ربما يختلف من نظام لاخر ومن ترميز لاخر مثل unicode او غيره

اذا بنظرى الدالة isDigit تكون هكذا أفضل :

static boolean IsDigit(char x) {
        return (x >= '0' && x <= '9');
    }

انت فى كل الحالات تقارن مع الرقم 9 ايا كان رقمه فى الجدول وباى ترميز وعلى اى نظام تشغيل

لاحظ && بدلا من &

خبرتك لاتسمح لك بمثل هذه ال bugs :)

تحياتى


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳                                  
 

#11

أهلا بك أستاذي

اقتباس
اولا هذه bitwise and وليست logical and

أعلم ذلك جيدا :)

لكن لو لاحظت معي أن العبارة x >= 0x30 هي عبارة منطقية نتبجتها إما صفر أو واحد و كذلك الحال مع x >= 0x39, لذا فاستعمال & أو && سيكون متطابقا في هذه الحالة. ما رأيك ؟ :happy:

اقتباس
اقترح عليك ان تتعامل مع الحرف مباشرة دون ربطه برقم من جدول الترميز لأنه ربما يختلف من نظام لاخر ومن ترميز لاخر مثل unicode او غيره

اقتراح جميل جدا, أشكرك على الإفادة.

تم تعديل هذه المشاركة بواسطة khaled_prg في 18 أبريل 2012 في 01:45

#12
اقتباس

لكن لو لاحظت معي أن العبارة x >= 0x30 هي عبارة منطقية نتبجتها إما صفر أو واحد و كذلك الحال مع x >= 0x39, لذا فاستعمال & أو && سيكون متطابقا في هذه الحالة. ما رأيك ؟ :happy:

نعم هو صحيح فى هذه الحالة وليس صحيحا ان تعتاد عليه :)

كما هو الحال فى اسماء الدوال IsDigit , IsString

تحياتى


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳                                  
 

#13
اقتباس
نعم هو صحيح فى هذه الحالة وليس صحيحا ان تعتاد عليه :)

أوكي, لن أكررها مرة أخرى أخي فتحي :)

اقتباس
كما هو الحال فى اسماء الدوال IsDigit , IsString

لم أفهم, ماذا تقصد ؟

#14
اقتباس

لم أفهم, ماذا تقصد ؟

أقصد ان اسماء الدوال تبدأ بحرف صغير lower أما أسماء الفئات فالعكس upper

على كل دعنا لا نغير مسار الموضوع

تحياتى


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳                                  
 

مواضيع مشابهة