15 خطای رایج در برنامه‌نویسی جاوا به همراه مثال و راه‌ حل

دسته بندی: جاوا
زمان مطالعه: 14 دقیقه
۱۳ بهمن ۱۳۹۸

جاوا یک زبان برنامه‌­نویسی شی­‌گرا است که با استفاده از آن می‌­توان برنامه‌­های کاربردی کوچک و بزرگ تحت دسکتاپ، تحت وب و همچنین اپلیکیشن­‌های موبایل ایجاد کرد. کاربردهای گسترده زبان جاوا و همچنین ویژگی­‌هایی مانند امنیت بالا و قابل حمل بودن کدهای نوشته شده به این زبان، برنامه‌­نویسان زیادی را در سراسر دنیا به خود جذب کرده است. زبان جاوا شباهت زیادی به زبان­‌های C و ++C داشته و از قواعد یکنواختی که در تمامی دستورات آن استفاده می‌­شود. کدنویسی آسان و  قواعد کدنویسی صریح جاوا نیز یکی از دلایلی است که پیشنهاد می‌­شود افراد تازه­‌کار، برنامه­‌نویسی را با این زبان شروع کنند.

خطاهای رایج برنامه­‌نویسی زبان جاوا:

هنگام توسعه نرم­‌افزار به زبان جاوا ممکن است با انواع بسیاری از خطاها مواجه شوید که بیش­‌تر آن­‌ها اجتناب‌­پذیر هستند. در واقع خطاها بخش جداناشدنی از توسعه نرم‌­افزار هستند و شناخت خطا­ها و روش حل آن‌­ها برای برنامه‌نویسان ضروریست. در این مقاله 15 مورد از متداول‌­ترین خطاهای رایج در جاوا به همراه مثال و راه حل­‌های مختلف گردآوری شده است.

Expected...

این خطا زمانی رخ می‌دهد که قسمتی از کد وجود نداشته باشد. برای مثال زمانی که گذاشتن یک ";" یا پرانتز را فراموش می کنید، این خطا رخ می دهد.

معمولا این پیغام خطا به مکان دقیقی که در آن خطا رخ داده است اشاره نمی­‌کند. روش‌­های یافتن مکان دقیق خطا:

  • اطمینان حاصل کنید که تمامی پرانتزهای باز، بسته شده هستند.
  • به خط قبلی مکانی که کامپایلر نشان می­دهد در آن خطا رخ داده نگاه کنید. کامپایلر تا زمانی که کدهای بیش­‌تری مشاهده نکند متوجه این خطای نرم‌افزاری نمی­‌شود.
  • گاهی اوقات کاراکترهایی مانند پرانتز باز نباید در جایگاه شروع قرار گیرند، پس برنامه­‌نویس برای ایجاد تعادل در پرانتزها، آن را نمی­‌بندد.

مثال:

private static double volume(String solidom, double alturam, double areaBasem, double raiom) {
double vol;
    if (solidom.equalsIgnoreCase("esfera"){
        vol=(4.0/3)*Math.pi*Math.pow(raiom,3);
    }
    else {
        if (solidom.equalsIgnoreCase("cilindro") {
            vol=Math.pi*Math.pow(raiom,2)*alturam;
        }
        else {
           vol=(1.0/3)*Math.pi*Math.pow(raiom,2)*alturam;
        }
    }
    return vol;
}

در این کد 2 خطا وجود دارد. که به صورت زیر برطرف می شوند:

if (solidom.equalsIgnoreCase("esfera") => if (solidom.equalsIgnoreCase("esfera"))

و

if (solidom.equalsIgnoreCase("cilindro")  => if (solidom.equalsIgnoreCase("cilindro"))

Unclosed String Literal

پیغام خطای "Unclosed String Literal" زمانی نمایش داده می‌­شود که انتهای یک string علامت کوتیشن وجود نداشته باشد. این خطای لفظی دقیقا به همان خطی که خطا در آن رخ داده است اشاره می‌­کند.

نکته: در صورتی که یک رشته از اجزای مختلفی تشکیل شده باشد که توسط علامت "+" به هم متصل شده و رشته را تشکیل دهند، ممکن است گذاشتن کوتیشن بین آن ها فراموش شود.

نکته: در کنار کوتیشن‌­هایی که بخشی از string هستند باید از "\" استفاده کرد.

مثال:

public abstract class NFLPlayersReference {
    private static Runningback[] nflplayersreference;
    private static Quarterback[] players;
    private static WideReceiver[] nflplayers;
    public static void main(String args[]){
    Runningback r = new Runningback("Thomlinsion");
    Quarterback q = new Quarterback("Tom Brady");
    WideReceiver w = new WideReceiver("Steve Smith");
    NFLPlayersReference[] NFLPlayersReference;
        Run();// {
        NFLPlayersReference = new NFLPlayersReference [3];
        nflplayersreference[0] = r;
        players[1] = q;
        nflplayers[2] = w;
            for ( int i = 0; i < nflplayersreference.length; i++ ) {
            System.out.println("My name is " + " nflplayersreference[i].getName());
            nflplayersreference[i].run();
            nflplayersreference[i].run();
            nflplayersreference[i].run();
            System.out.println("NFL offensive threats have great running abilities!");
        }
    }
    private static void Run() {
        System.out.println("Not yet implemented");
    }     
}

نمونه این خطا در خط 33 یافت می شود.

Illegal Start of an Expression

دلایل زیادی برای بروز خطای Illegal Start of an Expression وجود دارد. اگرچه عنوان این پیغام خطا کمک زیادی به رفع آن نمی­‌کند؛ برخی از برنامه‌­نویسان معتقدند که علت آن کدنویسی بد است.

زمانی که برای تعریف یک مقدار جدید یا اختصاص یک مقدار به متغیر از یک عبارت استفاده می­‌کنیم، ممکن است کامپایلر به دلیل پیدا نکردن سینتکس مورد انتظارش آن مقدار را شناسایی نکند و این خطا رخ دهد.

مثال:

public class Main{
  public static void main(String[] args) {
    count();
  public static int count(){
    return 0;
  }
}

برای مشاهده نمونه کدها و راه­‌حل های بیش­تر از خطای Illegal Start of an Expression اینجا را کلیک کنید.

Cannot Find Symbol

این خطا، خطایی بسیار متداول در بین دانشجویان مبتدی است. تمامی شناسه‌­ها در جاوا می بایست قبل از استفاده تعریف شوند زیرا کامپایلر هنگام کامپایل کردن کد نمی­تواند شناسه ها را تشخیص دهد.

دلایلی که می‌­توانند باعث دریافت پیغام خطای Cannot Find Symbol شوند:

  • املای اشتباه شناسه که موجب عدم تطبیق آن با شناسه­­‌ی تعریف شده می‌­شود.
  • عدم تعریف شناسه پیش از استفاده
  • استفاده از متغیر در خارج از حوزه­ای که تعریف شده است.
  • ایمپورت نکردن کلاسی که شناسه در آن تعریف شده است.

مثال:

public class Test {
       public static void main(String[] args) {
           int a = 2;
           int b = 4;
           sum = (a + b );
           System.out.println(sum);
       }
}

Public Class XXX Should Be in File

این خطا زمانی رخ می­دهد که کلاس XXX و نام فایل برنامه جاوا مطابقت نداشته باشند. کد شما فقط در صورت یکسان بودن نام کلاس و پرونده جاوا کامپایل می‌شود.

مثال:

package javaapplication3;  
  public class Robot {  
        int xlocation;  
        int ylocation;  
        String name;  
        static int ccount = 0;  
        public Robot(int xxlocation, int yylocation, String nname) {  
            xlocation = xxlocation;  
            ylocation = yylocation;  
            name = nname;  
            ccount++;         
        } 
  }
  public class JavaApplication1 { 
    public static void main(String[] args) {  
        robot firstRobot = new Robot(34,51,"yossi");  
        System.out.println("numebr of robots is now " + Robot.ccount);  
    }
  }

روش­‌های رفع این خطا:

  • برای کلاس و فایل نام یکسان انتخاب کنید.
  • به خاطر داشته باشید نام انتخاب شده را در آینده تغییر ندهید.

Incompatible Types

خطای "انواع ناسازگار" خطایی منطقی است که هنگامی رخ می­دهد که به یک متغیر مقداری نامتناسب با نوع آن داده شود.

برای مثال:

import java.util.*; 
import java.io.*;
public class Main {  
  public static int CheckNums(int num1, int num2) { 
       String answer = ""; 
      if (num1 == num2) {
          return -1;
      }  
      else if (num2 > num1) {
          answer = "false";
          return answer;
      }  
      else {
          answer = "true";
          return answer;
      }
  }
  }

برای پیشگیری از بروز این نوع خطا هنگام نوشتن برنامه اطمینان حاصل کنید که مقادیر متناسب با نوع داده متغیر­ها را در آن­ها ذخیره می­‌کنید.

Invalid Method Declaration; Return Type Required

این خطا بدین معناست که نوع بازگشتی متد تعریف شده به درستی تعیین نشده است.

مثال:

public class Circle
{
    private double radius;
    public CircleR(double r)
    {
        radius = r;
    }
    public diameter()
    {
       double d = radius * 2;
       return d;
    }
}

روش های رفع این خطا:

  • تعیین نوع بازگشتی
  • اگر بنا بر این باشد که متد تعریف شده مقداری برنگرداند، می‌­بایست نوع بازگشتی آن را "void" تعریف کنید.
  • Constructor یا سازنده نیازی به تعیین نوع بازگشتی ندارد. اما اگر خطایی در نام سازنده وجود داشته باشد، کامپایلر با سازنده مانند متدی که نوع بازگشتی آن به درستی تعریف نشده، رفتار می‌­کند.

(array) Not Initialized

این خطا زمانی رخ می‌­دهد که آرایه تعریف شده ولی به درستی مقداردهی نشده باشد.

مثال:

public class Test1 {
    public static void main(String[] args) {
        int ia1[] = { 1, 2, {1,2}};
        int ia2[] = ia1.clone();
        System.out.print((ia1 == ia2) + " ");
        ia1[1]++;
        System.out.println(ia2[1]);
    }
}

Non-Static Method ... Cannot Be Referenced From a Static Context

این خطا زمانی رخ می­‌دهد که یک متد غیر استاتیک در یک متد استاتیک فراخوانی می‌­شود.

برای مثال این خطا برای نمونه کد زیر رخ می‌­دهد:

class Sample
{
   private int age;
   public void setAge(int a)
   {
      age=a;
   }
   public int getAge()
   {
      return age;
   }
   public static void main(String args[])
   {
       System.out.println("Age is:"+ getAge());
   }
}

Method in Class Cannot Be Applied to Given Types

این خطا زمانی اتفاق می‌­افتد که پارامترهای اشتباه در متد فراخوانی می‌­شوند.

RandomNumbers.java:9: error: method generateNumbers in class RandomNumbers cannot be applied to given types;
generateNumbers();
required: int[]
found:generateNumbers();
reason: actual and formal argument lists differ in length

برای پیشگیری از این نوع خطا، از یکسان بودن پارامترهای استفاده شده در متد با پارامترهای مورد نیاز آن که در کنار نام تابع تعریف شده­اند اطمینان حاصل کنید.

Unreachable Statement

این خطا زمانی رخ می­‎دهد که یک عبارت در جایی نوشته شود که نتواند اجرا شود. برای مثال این خطا زمانی که عبارت بعد از break یا return نوشته شود، رخ می­‌دهد.

مثال:

public class JavaCodeGeeks
{
    public static void main(String[] args) {
        while(true)
        {
            System.out.println("Hi");
        }
        System.out.println("Hello");
}
}

NoClassDefFoundError

این خطا نشان می‌دهد که تعریف کلاس در هنگام تهیه برنامه پیدا شده است، اما کلاس برنامه در هنگام اجرا در دسترس نیست. علت دیگر بروز این خطا عدم تعریف Main است.

مثال:


public class Test {
        public Test() {
        System.out.println("A new instance of the Test class was created!");
        }
}

روش­های رفع این خطا:

  • قرار دادن فایل در دایرکتوری صحیح
  • اطمینان از هم نام بودن نام کلاس و فایل (حساس به بزرگ و کوچک بودن حروف)

Cannot Return a Value From Method Whose Result Type Is Void

این خطا زمانی رخ می‌­دهد که از متدی که نمی‌­تواند مقداری برگرداند، بخواهیم یک مقدار را return کند. این خطا معمولا با تغییر نوع تابع از void به int برطرف می­‌شود.

مثال:

public static void move()
{
    System.out.println("What do you want to do?");
    Scanner scan = new Scanner(System.in);
    int userMove = scan.nextInt();
    return userMove;
}
public static void usersMove(String playerName, int gesture)
{
    int userMove = move();
    if (userMove == -1)
    {
        break;
    }

Missing Return Value

این خطا زمانی رخ می­‌دهد که مقدار بازگشتی تابع، اشتباه بوده یا وجود نداشته باشد.

مثال: کد زیر دارای 3 خطای Missing Return Value می­‌باشد.

public class SavingsAcc2 {
    private double balance;
    private double interest;
    public SavingsAcc2() {
        balance = 0.0;
        interest = 6.17;
    }
    public SavingsAcc2(double initBalance, double interested) {
        balance = initBalance;
        interest = interested;
    }
    public SavingsAcc2 deposit(double amount) {
        balance = balance + amount;
        return;
    }
    public SavingsAcc2 withdraw(double amount) {
        balance = balance - amount;
        return;
    }
    public SavingsAcc2 addInterest(double interest) {
        balance = balance * (interest / 100) + balance;
        return;
    }
    public double getBalance() {
        return balance;
    }
}

ArrayIndexOutOfBoundsException

این پیغام یک خطای زمان اجراست که زمانی رخ می­دهد که قسمتی از کد سعی می­‌کند به مقادیری از آرایه دسترسی پیدا کند که وجود ندارند.

مثال:

public class ArrayIndexOutOfBoundException {   
    public static void main(String[] args) {  
String[] arr = {"Rohit","Shikar","Virat","Dhoni"};   
//Declaring 4 elements in the String array                                                 
        for(int i=0;i<=arr.length;i++) {         
//Here, no element is present at the iteration number arr.length, i.e 4  
             System.out.println(arr[i]);      
//So it will throw ArrayIndexOutOfBoundException at iteration 4           
        } 
    }   
}  

در این مثال با تغییر => به > خطا برطرف خواهد شد.

نتیجه­‌گیری

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

چه امتیازی به این مقاله می دید؟
نویسنده نازنین گودرزی
زندگی پر از زیبایی است، به آن توجه کن، به زنبور عسل، به کودک کوچک و چهره های خندان دقت کن، باران را نفس بکش و باد را احساس کن، زندگی ات را زندگی کن و برای رویاهایت مبارزه کن.

نظرات کاربران

اولین دیدگاه این پست رو تو بنویس !

ارسال دیدگاه
خوشحال میشیم دیدگاه و یا تجربیات خودتون رو با ما در میون بذارید :

 
گزارش مشکل