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