جاوا یک زبان برنامه نویسی شی گرا است که با استفاده از آن میتوان برنامه های کاربردی کوچک و بزرگ تحت دسکتاپ، تحت وب و همچنین اپلیکیشنهای موبایل ایجاد کرد. کاربردهای گسترده زبان جاوا و همچنین ویژگی هایی مانند امنیت بالا و قابل حمل بودن کدهای نوشته شده به این زبان، برنامه نویسان زیادی را در سراسر دنیا به خود جذب کرده است. زبان جاوا شباهت زیادی به زبانهای C و ++C داشته و از قواعد یکنواختی که در تمامی دستورات آن استفاده میشود. کدنویسی آسان و قواعد کدنویسی صریح جاوا نیز یکی از دلایلی است که پیشنهاد میشود افراد تازه کار، برنامه نویسی را با این زبان شروع کنند.
هنگام توسعه نرم افزار به زبان جاوا ممکن است با انواع بسیاری از خطاها مواجه شوید که بیشتر آنها اجتناب پذیر هستند. در واقع خطاها بخش جداناشدنی از توسعه نرم افزار هستند و شناخت خطاها و روش حل آن ها برای برنامه نویسان ضروریست. در این مقاله 15 مورد از متداول ترین خطاهای رایج در جاوا به همراه مثال و راه حلهای مختلف گردآوری شده است.
این خطا زمانی رخ میدهد که قسمتی از کد وجود نداشته باشد. برای مثال زمانی که گذاشتن یک ";" یا پرانتز را فراموش میکنید، این خطا رخ میدهد. معمولا این پیغام خطا به مکان دقیقی که در آن خطا رخ داده است اشاره نمی کند. روش های یافتن مکان دقیق خطا:
مثال:
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" زمانی نمایش داده میشود که انتهای یک 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 وجود دارد. اگرچه عنوان این پیغام خطا کمک زیادی به رفع آن نمی کند؛ برخی از برنامه نویسان معتقدند که علت آن کدنویسی بد است. زمانی که برای تعریف یک مقدار جدید یا اختصاص یک مقدار به متغیر از یک عبارت استفاده می کنیم، ممکن است کامپایلر به دلیل پیدا نکردن سینتکس مورد انتظارش آن مقدار را شناسایی نکند و این خطا رخ دهد. مثال:
public class Main{
public static void main(String[] args) {
count();
public static int count(){
return 0;
}
}
برای مشاهده نمونه کدها و راه حلهای بیشتر از خطای Illegal Start of an Expression اینجا را کلیک کنید.
این خطا، خطایی بسیار متداول در بین دانشجویان مبتدی است. تمامی شناسه ها در جاوا میبایست قبل از استفاده تعریف شوند زیرا کامپایلر هنگام کامپایل کردن کد نمیتواند شناسهها را تشخیص دهد. دلایلی که میتوانند باعث دریافت پیغام خطای 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);
}
}

این خطا زمانی رخ میدهد که کلاس 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);
}
}
روشهای رفع این خطا:
خطای "انواع ناسازگار" خطایی منطقی است که هنگامی رخ میدهد که به یک متغیر مقداری نامتناسب با نوع آن داده شود. برای مثال:
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;
}
}
}
برای پیشگیری از بروز این نوع خطا هنگام نوشتن برنامه اطمینان حاصل کنید که مقادیر متناسب با نوع داده متغیرها را در آنها ذخیره می کنید.
این خطا بدین معناست که نوع بازگشتی متد تعریف شده به درستی تعیین نشده است. مثال:
public class Circle
{
private double radius;
public CircleR(double r)
{
radius = r;
}
public diameter()
{
double d = radius * 2;
return d;
}
}
روشهای رفع این خطا:
این خطا زمانی رخ میدهد که آرایه تعریف شده ولی به درستی مقداردهی نشده باشد. مثال:
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]);
}
}

این خطا زمانی رخ می دهد که یک متد غیر استاتیک در یک متد استاتیک فراخوانی میشود. برای مثال این خطا برای نمونه کد زیر رخ میدهد:
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());
}
}

این خطا زمانی اتفاق میافتد که پارامترهای اشتباه در متد فراخوانی میشوند.
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
برای پیشگیری از این نوع خطا، از یکسان بودن پارامترهای استفاده شده در متد با پارامترهای مورد نیاز آن که در کنار نام تابع تعریف شدهاند اطمینان حاصل کنید.
این خطا زمانی رخ میدهد که یک عبارت در جایی نوشته شود که نتواند اجرا شود. برای مثال این خطا زمانی که عبارت بعد از break یا return نوشته شود، رخ می دهد. مثال:
public class JavaCodeGeeks
{
public static void main(String[] args) {
while(true)
{
System.out.println("Hi");
}
System.out.println("Hello");
}
}

این خطا نشان میدهد که تعریف کلاس در هنگام تهیه برنامه پیدا شده است، اما کلاس برنامه در هنگام اجرا در دسترس نیست. علت دیگر بروز این خطا عدم تعریف Main است. مثال:
public class Test {
public Test() {
System.out.println("A new instance of the Test class was created!");
}
}
روشهای رفع این خطا:
این خطا زمانی رخ میدهد که از متدی که نمیتواند مقداری برگرداند، بخواهیم یک مقدار را 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;
}

این خطا زمانی رخ می دهد که مقدار بازگشتی تابع، اشتباه بوده یا وجود نداشته باشد. مثال: کد زیر دارای 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;
}
}

این پیغام یک خطای زمان اجراست که زمانی رخ میدهد که قسمتی از کد سعی می کند به مقادیری از آرایه دسترسی پیدا کند که وجود ندارند. مثال:
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
}
}
}
در این مثال با تغییر => به > خطا برطرف خواهد شد.
نتیجه گیری
همان طور که پیش تر نیز گفته شد، در برنامه نویسی جاوا از قواعد مشخصی برای تعریف دقیق دستورات، متغیرها، کلاسها و... استفاده میشود. با شناخت و رعایت این قواعد به سادگی می توان از بروز بسیاری از خطاها جلوگیری کرد. یادگیری این قواعد تنها با تمرین زیاد حاصل می شود و اگر تازه کار هستید ممکن است در ابتدای کدنویسی با خطاهای زیادی مواجه شوید که البته به مرور زمان با تکرار و تمرین بیش تر، تعداد این خطاها کاهش می یابد. تجربه شما از برنا مه نویسی با زبان جاوا چیست؟ آیا خطایابی و رفع خطا در زبان جاوا برای شما آسا نتر بوده است یا سایر زبا ن های برنامه نویسی؟ نظرات خود را با ما به اشتراک بگذارید.
دوره الفبای برنامه نویسی با هدف انتخاب زبان برنامه نویسی مناسب برای شما و پاسخگویی به سوالات متداول در شروع یادگیری موقتا رایگان شد: