درود مهمان گرامی! ثبت نام

جشنواره بازیسازی پرومیکرز

امتیاز موضوع:
  • 0 رأی - میانگین امتیازات: 0
  • 1
  • 2
  • 3
  • 4
  • 5
سوال در مورد C++
#51
واقعا ممنون خیلی ممنون

ولی من باز هم سوال دارم ممنون میشم باز هم جوابم رو بدین

resim

دقیقا چرا بعد از دستور "throw" ; قرار گرفته و توی "(...)catch" این سه نقطه ورودی یعنی چی ؟

و این هم یک سوال دیگه
resim

ممنون
پاسخ
 سپاس شده توسط sajjad3011
#52
این مباحث جزو درس JAVA هست و خیلی بخش قشنگی هست و اختصاص داره به فصل مدیریت خطا یا error management و حتی ازت تشکر می کنم بابت سوالت، و اما پاسخ.

ما توی basic4android یا بعضی زبونا یه چیز داریم به نام Exception یا همون "استثنا"ی خودمون. از این استثنا با نام خلاصه ی e هم توی سیشارپ یا بعضی زبون ها و حتی گاهی جاوا استفاده می شه.

توی vb6 (ویژوال بیسیک شش) دستوری داشتیم تحت عنوان on error resume next که می گفت اگه خطا داشتیم محل نذار برو دستور خط بعدی رو اجرا کن. یا دستوری داشتیم به اسم on error goto labelName که می گفتیم اگه خطایی داد برو به برچسبی که معرفی کردیم.

و اما throw یعنی چی؟ throw از لحاظ لغوی به معنی پرتاب هست. اما چه ربطی به بحث ما داره ؟

حتما دیدید همیشه می گن java بهترین زبون هست و از لحاظ امنیت حرف اول رو می زنه(وارد مبحث python نشید فعلا).یکی از دلایل اینکه جاوا امنیتی بسیار خوبی داره همینه که با استفاده از دستور throw می تونیم مدیریت خطا کنیم و دیگه نذاریم خطای رخ داده سیگنالش به کامپایلر یا مفسر برسه. می یایم به دستور throw خطاهای رخ داده رو پرتاب می کنیم به یه سمت دیگه. یا در اصطلاح پاس می دیم به بخشی داخل کدهای خودمون و این خطا رو می یایم تجزیه تحلیل می کنیم(با دستورات و توابع یا متدهای تعریف شده ی زبون جاوا).

ما خطاهای مختلفی داریم و برای مدیریت خطاهای مختلف کلاس های خاص وجود داره . مثلا IOException برای مدیریت استثنا(خطا)های ورودی خروجی هست.(دستوارت try catch هم داریم اینجا بحث نمی کنم)

مثال :
کد php:
//A void method
public void sample()
{
   
//Statements
   //if (somethingWrong) then
   
IOException e = new IOException();
   throw 
e;
   
//More Statements
 

در کد فوق ما متغیری به اسم e از نوع IOEception ایجاد کردیم و با دستور new حافظه ای به فرمت و قالب و ساختار نوع اون کلاس بهش اختصاص دادیم.

سپس دستور throw e خودش خودکار به کامپایلر دستور می ده اگه خطایی رخ داد به خروجی نبر ، پرتش کن توی جایی از حافظه که به متغیر e اختصاص دادیم. توی کدها هم می تونیم این e رو مدیریت کنیم مثلا e بذاریم بعدش نقطه بذاریم و ببینیم چیا داره.مثل کد خطا،مثل متن خطا،سطر و ستونی که خطا رخ داده و ... .

مثال دیگه با دستور try catch:

کد php:
class ThrowDemo{
   public static 
void main(String args[]){
      try{
       
char array[] = {'a','b','g','j'};
       
/*I'm displaying the value which does not
        * exist so this should throw an exception
        */
       
System.out.println(array[78]);
      }catch(
ArithmeticException e){
        
System.out.println("Arithmetic Exception!!");
       }
   }

خروجی:
کد:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException:
78 at beginnersbook.com.ThrowDemo.main(Details.java:9)

مثال دیگه از throw exception

کد php:
package beginnersbook.com;
class 
MyOwnException extends Exception {
   public 
MyOwnException(String msg){
      
super(msg);
   }
}

class 
EmployeeTest {
   static 
void  employeeAge(int agethrows MyOwnException{
      if(
age 0)
         throw new 
MyOwnException("Age can't be less than zero");
      else
         
System.out.println("Input is valid!!");
   }
   public static 
void main(String[] args) {
       try {
            
employeeAge(-2);
       }
       catch (
MyOwnException e) {
            
e.printStackTrace();
       }
   }

خروجی:
کد:
beginnersbook.com.MyOwnException: Age can't be less than zero


مثالی از throw های تو در تو:
کد php:
package beginnersbook.com;
class 
Exception2{
   static 
int sum(int num1int num2){
      if (
num1 == 0)
         throw new 
ArithmeticException("First parameter is not valid");
      else
         
System.out.println("Both parameters are correct!!");
      return 
num1+num2;
   }
   public static 
void main(String args[]){
      
int res=sum(0,12);
      
System.out.println(res);
      
System.out.println("Continue Next statements");
   }

خروجی:

کد:
Exception in thread main java.lang.ArithmeticException: First parameter is not valid

توی مثال آخر جواب اون سوالت رو که آیا حالت بازگشتی داره یا نه می تونی پیدا کنی. من پاسخ رو نمی دونم از استادت بپرس.

دستور دیگه ای غیر از throw هست به نام throws که میذارم برای مطالعه بیشتر خودت.
منبع:

http://beginnersbook.com/2013/04/throw-in-java/
https://telegram.me/gameoverblog
بیشتر از آنچه برای موفق بودن تلاش می کنی برای با ارزش بودن تلاش کن.آلبرت انیشتین.



پاسخ
 سپاس شده توسط Hamed-razor
#53
ممنون
من با کمک <ofstream> اطلاعات رو ذخیره میکنم ولی یک مشکلی که هست من بعد از این که دوباره میخوام اطلاعات جدید بریزم توی فابل میاد کل اطلاعات فایل رو پاک میکنه و بعد اطلاعات جدید رو میریزه

من میخوام هر بار که مثلا یک خط جدید وارد میکنم توی فایل بیاد آخرین خط نه این ....
پاسخ
#54
موقع باز کردن فایل به جای w، از پارامتر a استفاده کن
a به معنی append یا پیوستن اطلاعات به اطلاعات قبلی هست.
w به معنی write یا rewrite مجدود روی فایل قبلی هست.یعنی فایل پاک می شه دوباره ایجاد میشه.
https://telegram.me/gameoverblog
بیشتر از آنچه برای موفق بودن تلاش می کنی برای با ارزش بودن تلاش کن.آلبرت انیشتین.



پاسخ
 سپاس شده توسط Hamed-razor


موضوعات مرتبط با این موضوع...
موضوع نویسنده پاسخ بازدید آخرین ارسال
Question سوال در مورد OpenGL Hamed-razor 2 831 4/10/1394، 11:08 عصر
آخرین ارسال: sajjad3011
Information سوال در مورد شروع یادگیری C++ mhs1378 3 1,275 18/7/1392، 12:04 صبح
آخرین ارسال: imans77
  چندتا سوال در مورد C++ 7876 1 1,200 9/6/1392، 02:07 عصر
آخرین ارسال: bazebaz
Question کمک در مورد QT N___F___T 23 4,722 5/2/1392، 10:56 صبح
آخرین ارسال: devil_man
  سوال در مورد ویژوال سی++ Amirns 1 1,322 24/7/1391، 09:34 عصر
آخرین ارسال: mohammadali1375



کاربرانِ درحال بازدید از این موضوع: 1 مهمان